链式异步函数
Chain async functions
在异步函数中,我可以获得一个异步值,如下所示:
const foo = await myAsyncFunction()
如果我想对结果调用方法,使用同步函数我会做类似 myAsyncFunction().somethingElse()
是否可以使用异步函数链接调用,或者您是否必须为每个结果分配一个新变量?
您可以在表达式中等待,无需将其分配给新变量。 (尽管将其分配给变量可能更具可读性。)
const foo = await (await myAsyncFunction()).somethingElseAsync()
或者,如果您想对结果调用同步方法:
const foo = (await myAsyncFunction()).somethingElseSync()
作者 Tamas Hegedus,在 await
表达式周围加上括号绝对是搭配原版 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>
你可以试试这个包。
// 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)
我很惊讶它还没有被提及,但在没有额外变量的情况下实现这一点的最可读的方法可能是使用 .then
链,并且 await
最后:
await myAsyncFunction()
.then(res => res.somethingElse())
请记住,await
与 承诺一起工作,但不会 替换 它们!
在异步函数中,我可以获得一个异步值,如下所示:
const foo = await myAsyncFunction()
如果我想对结果调用方法,使用同步函数我会做类似 myAsyncFunction().somethingElse()
是否可以使用异步函数链接调用,或者您是否必须为每个结果分配一个新变量?
您可以在表达式中等待,无需将其分配给新变量。 (尽管将其分配给变量可能更具可读性。)
const foo = await (await myAsyncFunction()).somethingElseAsync()
或者,如果您想对结果调用同步方法:
const foo = (await myAsyncFunction()).somethingElseSync()
await
表达式周围加上括号绝对是搭配原版 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>
你可以试试这个包。
// 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)
我很惊讶它还没有被提及,但在没有额外变量的情况下实现这一点的最可读的方法可能是使用 .then
链,并且 await
最后:
await myAsyncFunction()
.then(res => res.somethingElse())
请记住,await
与 承诺一起工作,但不会 替换 它们!