ES8等待电话不等我

问题描述 投票:0回答:1

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

在下面的代码中(处理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;

}
node.js promise async-await
1个回答
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");
  }
};
© www.soinside.com 2019 - 2024. All rights reserved.