ES8等待电话不等我

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES8等待电话不等我相关的知识,希望对你有一定的参考价值。

我的问题是我正在尝试等待一些承诺,但我的等待呼叫似乎立即返回到调用函数。

在下面的代码中(处理POST的控制器函数的一部分),在执行promises之前执行函数调用之后的“文件出来”日志。我的异步函数似乎在“等待”调用时返回。

然而,“await”仍然等待所有承诺执行,所以“我刚刚完成等待”日志确实将魔术var正确地插入到req.files中。

const upload = multer({
  storage: multer.diskStorage ({
    destination: (req, file, cb) => { cb(null, config.DESTINATION) }
  })
}).array(config.FIELD_NAME);

exports.upload_image = function(req, res) {

  upload(req, res, (err) => {
    if (err) {
      return res.end("error uploading file");
    } 
    // got file ok, do validation
    checkAreDicom2( req.files );
    console.log("files coming out: ", req.files);

    return res.end("OK");

  });
}

async function checkAreDicom2(inFiles) {

  let promises = inFiles.map(function (file) {
    return new Promise( function (resolve, reject) {
      fs.createReadStream(file.path,{start: 128, end: 131, autoClose: true})
      .on('error',reject)
      .on('data', (chunk) => file.magic = file.magic ? file.magic += chunk : chunk)
      .on('end', resolve);
    });
  });
  await Promise.all(promises);

  console.log("i just finished waiting: ", inFiles);
  return;

}
答案

await正在等待Promise.all,并且正确延迟后的日志。但是它当然不会阻止函数的调用者。

因此upload_image中的回调不等待异步处理,它只是接收checkAreDicom2(…)返回的承诺 - 并丢弃它,并立即记录一些东西。您需要再次在此明确等待异步结果。

exports.upload_image = async function(req, res) {
  try {
    await new Promise((resolve, reject) => {
      upload(req, res, (err) => {
        if (err) reject(err);
        else resolve();
      });
    });
    // got file ok, do validation
    await checkAreDicom2( req.files );
//  ^^^^^
    console.log("files coming out: ", req.files);

    return res.end("OK");
  } catch(err) {
    return res.end("error uploading file");
  }
};

以上是关于ES8等待电话不等我的主要内容,如果未能解决你的问题,请参考以下文章

ES8 走马观花(ECMAScript2017 新特性)

在 React 应用中设置 Babel 生成的 EcmaScript 版本

android小知识点代码片段

ES8 使用带有 async 和 await 的箭头函数

firebase 的短信代码不匹配

JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段