【问题标题】:Using await in promise chain在承诺链中使用 await
【发布时间】:2018-01-05 20:10:13
【问题描述】:

我刚刚升级到节点 8,想开始使用 async/await。我遇到了一个错误,我花了一段时间才解决,实际上我只是想知道是否有更优雅的方式。我不想在此时重构整个函数,因为它会导致所有二次重构。

async doSomething(stuff) {
...

  return functionThatReturnsPromise()
    .then((a) => ...)
    .then((b) => ...)
    .then((c) => {
      const user = await someService.createUser(stuff, c);
      user.finishSetup();
    });
};

有没有办法能够在承诺链中使用await,而不必将上面的所有内容都重构为async

【问题讨论】:

  • 不应该是.then(async (c) => { 才有效吗?
  • 这可能是我之前在搞砸这个时错过的......我已经将整个链包裹在异步 IEFE 中。谢谢!
  • 在这个简单的示例中,我不需要等待,但在我拥有的真实代码中,需要对用户执行一些操作。
  • 是的,await 只能在 async 的函数内使用 - 异步函数内的函数不是异步的,除非它本身被特别标记为这样:p
  • 我不明白的是,当整个函数是 async 函数时,为什么函数仍在使用 Promise。

标签: javascript node.js async-await


【解决方案1】:

回调未声明为async 函数。您只能在 async 函数内直接使用 await Promise

async doSomething(stuff) {
// ...

  return functionThatReturnsPromise()
    .then((a) => /* ... */)
    .then((b) => /* ... */)
    .then(async (c) => {
      const user = await someService.createUser(stuff, c);
      return user;
    });
};

此外,如果您正在利用 async 函数,则不应需要使用 then

async doSomething(stuff) {
// ...

  const a = await functionThatReturnsPromise();
  const b = // ...
  const c = // ...
  const user = await someService.createUser(stuff, c);
  return user;
};

【讨论】:

  • 是的,感谢@Jaromanda X,我现在明白了。我也明白,如果我将整个函数转换为 async/await,这不会是一个问题,但这是核心函数应用程序,我宁愿不接触更多,因此努力保留承诺链并添加我需要的新部分。
  • 如果我将整个函数转换为 async/await 是什么意思?您可以在 async 函数中 await 任何 Promise
  • 现在整个函数是一个很长的 Promise 链。我想避免将链中的每个“链接”转换为awaited。
  • 调用代码不应该被重构不会知道调用异步函数或返回承诺的常规函数​​之间的区别。按照规范,当调用异步函数时,它会返回一个 Promise。
  • @CodesLikeA_Mokey 我明白了,这是一个不错的决定 :) 希望将来会有一些测试来减少像这样的重大重构的不确定性?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
相关资源
最近更新 更多