26

在异步函数中,我可以得到一个异步值,如下所示:

const foo = await myAsyncFunction()

如果我想在结果上调用一个方法,使用同步功能,我会做类似的事情myAsyncFunction().somethingElse()

是否可以使用异步函数链接调用,还是必须为每个结果分配一个新变量?

4

4 回答 4

44

您可以在表达式中等待,无需将其分配给新变量。(尽管将其分配给变量可能更具可读性。)

const foo = await (await myAsyncFunction()).somethingElseAsync()

或者,如果您想对结果调用同步方法:

const foo = (await myAsyncFunction()).somethingElseSync()
于 2016-07-28T19:05:47.287 回答
9

我很惊讶它还没有被提及,但在没有额外变量的情况下实现这一点的最易读的方法可能是使用.then链,await最后:

await myAsyncFunction()
  .then(res => res.somethingElse())

请记住,await与Promise一起工作,但不能取代它们!

于 2021-05-22T14:56:08.727 回答
3

你可以试试这个包。

// Instead of thens
fetch(url)
  .then(res => res.json())
  .then(json => json.foo.bar)
  .then(value => console.log(value))

// Instead of awaits
const res = await fetch(url)
const json = await res.json()
const value = json.foo.bar
console.log(value)

// With prochain
const value = await wrap(fetch(url)).json().foo.bar
console.log(value)
于 2021-05-22T14:35:51.517 回答
1

Tamas Hegedus 的这个答案在表达式周围加上括号await绝对是使用 vanilla JavaScript 的方法。

或者,如果您正在寻找常用的链式 JS 方法并且不介意第三方模块,您可以在 npm 上使用async-af 。有了它,您可以像这样链接异步方法:

const promises = [1, 2, 3].map(n => Promise.resolve(n));

AsyncAF(promises).map(n => n * 2).filter(n => n !== 4).forEach(n => console.log(n));
// logs 2 then 6
<script src="https://unpkg.com/async-af@7.0.11/index.js"></script>

于 2018-06-21T14:38:17.843 回答