【问题标题】:How to await in a chain?如何在链中等待?
【发布时间】:2022-01-13 06:46:59
【问题描述】:

这是 node.js 中的 Azure 函数 httpTrigger。如何等待f1() 完成然后调用f2()

model.exports = main(param)  // async main plus await f1(param) don't wait either.
{
  f1(param)
  .then(
    good => f2(good, callback),  // execution jumps into f2 without waiting for f1 finishes
    bad => {...}
  );
}

async function f1(param)
{
  try
  {
    // await NOT wait here, 
    // but waits in Express
    await googlelib.verifyIdToken(something, (err, ok) =>
    {
      if (err) { return Promise.reject("Invalid"); }
      else     { return Promise.resolve("OK"); }
    });
  }
  catch (e) { return Promise.reject("catch"); }
}
      

【问题讨论】:

  • return googlelib.verifyIdToken(something);,根本不传回调。
  • googlelib 来自哪个库?
  • 当您将回调传递给googlelib.verifyIdToken() 时,它可能不会返回承诺,因此await 不会完成任何事情。使用 promise 接口或回调接口,而不是两者的组合。而且,如果您希望 async 函数返回一个承诺,该承诺会在您的异步工作完成时解决,那么只能在该函数内使用承诺接口,因为普通回调根本不使用 async 函数.
  • @slebetman const googlelib = new OAuth2Client(googleClientID);
  • @PatrickRoberts 似乎是个好主意,google doc

标签: node.js promise


【解决方案1】:

如果googlelib.verifyIdToken() 支持将 Promise 作为其接口的内置部分(只要您不向其传递回调),那么您可以将代码更改为:

function f1(param) {
    return googlelib.verifyIdToken(something);
}

而且,您将直接返回googlelib.verifyIdToken() 提供的承诺,允许调用者在f1(...) 返回的结果上使用await.then()


如果googlelib.verifyIdToken() 不支持将promises 作为其接口的内置部分(当你不向它传递回调时),那么你可以自己“promisify”它:

const {promisify} = require('util');

// create promisified interface .verifyIdTokenP
googlelib.verifyIdTokenP = promisify(googlelib.verifyIdToken);

// use that promisified interface
function f1(param) {
    return googlelib.verifyIdTokenP(something);
}

这种手动承诺函数的过程适用于任何支持“nodejs 异步调用约定”的异步 API,其中函数接受回调作为最后一个参数,并且该回调将使用两个参数作为 callback(err, value) 调用。如果异步 API 的工作方式与此不同,则您不能为其使用 util.promisify() 函数,而必须手动将其包装在您自己的 Promise 中。

【讨论】:

  • 纯英文,非常容易理解。喜欢它。
猜你喜欢
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
相关资源
最近更新 更多