async / await函数的目的是简化行为 同步使用promises并在组上执行某些行为 承诺正如Promise类似于结构化回调, async / await类似于组合生成器和promise。
我理解async / await,generator和promises的基本概念。但是,我并不完全理解 async / await类似于组合生成器和承诺的含义。
async / await简化了生成器和承诺可以一起做什么?任何一个例子?
答案 0 :(得分:7)
是的,你是对的。首先使用生成器和承诺的示例:
function *gen () {
const promiseValue = yield new Promise((resolve) => resolve(42));
console.log(promiseValue);
}
// .. and at some other context using '*gen'
const iterator = gen();
const { value: promise } = iterator.next(); // Promise (42)
promise.then((resolvedValue) => iterator.next(resolvedValue)); // logs 42
这个生成器产生一个Promise
到外部世界,我们通过将它作为参数传递回iterator.next
调用后传递回生成器的值,一旦该承诺结算。
此模式至少与所谓的任务相交。这样做的缺点是,每次产生的promise都会解析时,我们必须在迭代器上手动调用next
。这就是async await
的来源:
async function task() {
const promiseValue = await new Promise((resolve) => resolve(42));
console.log(promiseValue);
}
这就是它的全部内容。异步函数将暂停,直到await
关键字前面的promise表达式解析为止,表达式将计算为promise的自动 unwrap - 即其最终值。
然后await表达式的结果(在我们的例子中为42
)将被分配给promiseValue
,就像yield
一样。这一切都发生在函数继续执行到下一个语句之前。
这与上面的生成器片段基本上是相同的行为。
虽然根据我的经验,这个例子似乎是发生器和异步函数最常见的用例,其中async / await肯定是更清洁的方法,但是生成器确实具有async / await没有的强大功能。以同样的方式(但那是另一个话题)。