ES8等待电话不等我

时间:2018-02-28 09:55:52

标签: node.js promise async-await

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

在下面的代码中(处理POST的控制器功能的一部分),"文件出来"在执行promise之前执行函数调用之后的log。我的异步功能似乎在" await"调用

然而,"等待"仍然等待所有承诺执行,所以"我刚刚等待" log 将magic 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;

}

1 个答案:

答案 0 :(得分:1)

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");
  }
};
相关问题