javascript - 在 then 回调中使用 await - 保留关键字 'await'

标签 javascript node.js async-await ecmascript-2017

在 node.js 中,我有一个数据库事务,我想在 then 回调中调用一个 async 方法,但我收到错误消息 关键字“等待”已保留

这是异步 saveImage 函数:

const saveImage = async (parsedLink) => {
  AWS.config.region = config.awsSettings.region;
  AWS.config.accessKeyId = config.awsSettings.accessKeyId;
  AWS.config.secretAccessKey = config.awsSettings.secretAccessKey;
  const bucket = new AWS.S3({
    params: {
      Bucket: config.awsSettings.images_bucket_name,
    },
  });

  const currentDateString = new Date().toISOString().replace(/\:|\./g, '-');
  const bodystream = new Buffer(parsedLink.imgUrl, 'binary');
  const imageUrlDomain = parseDomain(parsedLink.linkUrl).domain;

  const params = {
    Key: `${parsedLink.id}/${imageUrlDomain}_${currentDateString}${parsedLink.imgType}`,
    ContentType: parsedLink.imageMime,
    ContentEncoding: 'base64',
    Body: bodystream,
  };

  const resultPromise = await bucket.upload(params).promise();
  return resultPromise.Location;
};

如果我想使用 saveImage 函数,我会收到错误消息。

module.exports.addTestObject = async (ctx) => {
  const testObj = ctx.request.body;
  try {
    switch (testObj.type) {
      case interestT.getType.link: {
        const knexTestObject = TestObject.knex();
        transaction(knexTestObject, trx =>
            TestObject.query(trx)
              .insert({
                interestDate: testObj.date,
              })
              .then(newInterest => {
                // save image
                if (parsedLink.saveImg) {
                  parsedLink.imgUrl = await saveImage(testObj);
                }

                newInterest.$relatedQuery('linkInterestsRel', trx).insert({
                  linkHeader: testObj.linkHeader,
                }),
              }
              ),
          )
          .then((linkInterest) => {
            console.log(linkInterest);
          })
          .catch((err) => {
            throw err;
          });
        break;
      }
      default:
        break;
    }
    ctx.response.body = interestObj;
  } catch (err) {
    const statusCode = err.status || 400;
    ctx.throw(statusCode, err.message);
  }
};

最佳答案

常规 function 同步运行直到它们返回。因此,您不能在其中使用 await,因为您不能以同步方式等待异步事件。

JavaScript 也有 async function,它们看起来像常规函数,但在概念上完全不同:它们同步运行直到到达 await,然后它们 停止并在等待的 Promise 解决后继续。因此,它们不能同步返回结果,而是返回一个 Promise,然后在函数完成执行时解析该 Promise。

因此您需要将函数转换为异步函数:

 async function getUsername() { // <-- async keyword here
    return (await getUser()).name; // <-- await can be used inside
 }

现在这也适用于 .then 回调:

 getUser().then(async function(user) {
    const friends = await getFriends(user);
    // ...
 })

但这在某种程度上将抽象异步函数与其底层原始 Promise 混合在一起。如果你只是 await Promise 而不是添加 .then 回调,代码会变得更易读:

 (async function() {
    const user    = await getUser();
    const friends = await getFriends(user);
 })();

具体问题可以改写为:

 const linkInterest = await transaction(knexTestObject, async trx => {
     const newInterest = await TestObject.query(trx)
          .insert({  interestDate: testObj.date,   });

     if (parsedLink.saveImg) {
       parsedLink.imgUrl = await saveImage(testObj);
     }

    await newInterest.$relatedQuery('linkInterestsRel', trx)
       .insert({  linkHeader: testObj.linkHeader, }),
});

关于javascript - 在 then 回调中使用 await - 保留关键字 'await',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48172656/

相关文章:

javascript - 如何在 Stampery API.JS 文件中设置 API key

node.js - 将 Angular 应用程序从版本 6 升级到版本 7 后如何修复对等依赖警告

reactjs - 如何在 React props/state 中使用 async/await promises?

javascript - 使用 Fs/Node/Json2Csv 将行添加到 CSV

javascript - javascript 中的异步等待 sqlite

c# - PostSubmitter 的异步 CTP

javascript - JSON 解析转义字符串

javascript - 如何在javaScript中使用排列和组合

javascript - 如何根据从下拉菜单中选择的城市显示 Google map

javascript - Onclick可见div框