Javascript 异步/等待vs组合生成器和承诺?

Javascript 异步/等待vs组合生成器和承诺?,javascript,promise,async-await,generator,Javascript,Promise,Async Await,Generator,异步/等待函数的目的是简化 同步使用承诺,并在团队中执行某些行为 一系列的承诺。正如承诺类似于结构化回调一样, async/await类似于组合生成器和承诺 我了解异步/等待、生成器和承诺的基本概念。然而,我并不完全理解说async/await类似于将生成器和承诺结合起来是什么意思。 那么async/await简化了生成器和承诺可以一起做什么?有什么例子吗?是的,你是对的。有一个发电机的例子,首先承诺: function *gen () { const promiseValue = yi

异步/等待函数的目的是简化 同步使用承诺,并在团队中执行某些行为 一系列的承诺。正如承诺类似于结构化回调一样, async/await类似于组合生成器和承诺

我了解异步/等待、生成器和承诺的基本概念。然而,我并不完全理解说async/await类似于将生成器和承诺结合起来是什么意思。


那么async/await简化了生成器和承诺可以一起做什么?有什么例子吗?

是的,你是对的。有一个发电机的例子,首先承诺:

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
,我们通过将其作为参数传递给
迭代器将其值传递回生成器。下一个
调用,一旦该Promise解析

这种模式至少与所谓的任务相交叉。这样做的缺点是,每次解析承诺时,我们都必须在迭代器上手动调用
next
。这就是
async await
的作用:

async function task() {
    const promiseValue = await new Promise((resolve) => resolve(42));
    console.log(promiseValue);
}
这就是全部。异步函数将暂停,直到前面有
wait
关键字的承诺表达式解析,并且该表达式将计算为承诺的自动展开-即其最终值

然后等待表达式的结果(
42
,在我们的例子中)将被分配给
promiseValue
,就像
yield
一样。这一切都发生在函数继续执行下一条语句之前

这与上面的代码片段和生成器的行为基本相同


虽然根据我的经验,这个例子似乎是生成器和异步函数最常见的用例,其中async/await无疑是更干净的方法,但是生成器确实有一些真正强大的功能,async/await没有以同样的方式(但这是另一个主题)。

是的,你说得对。先举一个发电机和承诺的例子:

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
,我们通过将其作为参数传递给
迭代器将其值传递回生成器。下一个
调用,一旦该Promise解析

这种模式至少与所谓的任务相交叉。这样做的缺点是,每次解析承诺时,我们都必须在迭代器上手动调用
next
。这就是
async await
的作用:

async function task() {
    const promiseValue = await new Promise((resolve) => resolve(42));
    console.log(promiseValue);
}
这就是全部。异步函数将暂停,直到前面有
wait
关键字的承诺表达式解析,并且该表达式将计算为承诺的自动展开-即其最终值

然后等待表达式的结果(
42
,在我们的例子中)将被分配给
promiseValue
,就像
yield
一样。这一切都发生在函数继续执行下一条语句之前

这与上面的代码片段和生成器的行为基本相同


虽然在我的经验中,这个例子似乎是生成器和异步函数最常见的用例,其中异步/等待无疑是更干净的方法,但是生成器确实有一些真正强大的功能,异步/等待以同样的方式不具备这些功能(但这是另一个主题).

阅读以了解promises、Generator和
async/await
之间的区别。Generator被用作一种黑客,用来做
async
/
await
现在做的事情。我建议避免这种比较,但是,它应该被视为一件历史文物。我认为MDN需要一个很好的编辑…阅读以理解promises、Generator和
async/await
之间的区别。Generator被用作一个黑客来完成
async
/
await
现在所做的事情。我建议避免这种比较,但是,它应该被视为一件历史文物。我认为MDN需要一个好的编辑…我不同意最后添加的意见。生成器最常见的用例是生成无限迭代器和实现延迟计算的查询。太好了,谢谢你直截了当地说出来,Jeffrey。我在评论队列中偶然发现了这一点,感谢您注意到@PhiQuangPhuoc。我不同意最后添加的意见。生成器最常见的用例是生成无限迭代器和实现延迟计算的查询。太好了,谢谢你直截了当地说出来,Jeffrey。我在评论队列中偶然发现了这个,谢谢你注意到@phiquangpuoc。