当前位置: 首页 > 知识库问答 >
问题:

Javascript中的异步生成器:产生promise和产生等待的promise之间有区别吗?

惠诚
2023-03-14

我正在研究ES9中提出的异步生成器,以便能够掌握逻辑。

因为每个产生的值都被用作返回对象中的值属性——由Promise包装——来自下一个()调用:

async function * asyncGen() {
    yield 1;
    yield 2; 
}

let asyncIterator = asyncGen();

asyncIterator.next(); // Promise fullfilled with {value: 1, done: false}

asyncIterator.next(); // Promise fullfilled with {value: 2, done: false}

我认为这对我的promise也是正确的:

async function * asyncGen() {
    yield Promise.resolve(3);
    yield new Promise(done => setTimeout(done, 10000));
}

let asyncIterator = asyncGen();

asyncIterator.next();
// Expected: Promise fullfilled with {value: Promise fullfilled with 3, done: false}
// Get: Promise fullfilled with {value: 3, done: false}

asyncIterator.next();
// Expected: Promise fullfilled with
// {value: Promise pending for 10 seconds, then fullfilled with undefined, done: false}
// Get: Promise pending for 10 seconds,
// then fullfilled with {value: undefined, done: false}

因此,这些promise被合并在一起。这听起来并不坏,但我并不认为这是因为:

async function * asyncGen() {
    yield await Promise.resolve(3);
    yield await new Promise(done => setTimeout(done, 10000));
}

let asyncIterator = asyncGen();

asyncIterator.next(); // Promise fullfilled with {value: 3, done: false}

asyncIterator.next(); 
// Promise pending for 10 seconds,
// then fullfilled with {value: undefined, done: false}

那么,关键字wait与关键字yield在同一个表达式中使用完全无用,还是我遗漏了一些重要的内容?

共有2个答案

丁长卿
2023-03-14

将等待和收益结合起来的一个有趣方面是,等待不能阻止收益回报promise,但它可以阻止promise兑现:

async function* asyncGenerator() {
    console.log('Start');
    const result = await doSomethingAsync(); // (A)
    yield 'Result: '+result; // (B)
    console.log('Done');
}

ES2018:Axel Rauschmayer博士的异步迭代

山煜祺
2023-03-14

异步生成器展开产生promise,以避免promise(例如,下一个方法返回的promise)的promise(值字段内的promise)。一个JavaScript语言总是远离的概念。

 类似资料:
  • 我一直在使用异步生成器,试图创建一个“promise排序”生成器,它接受一系列promise,并按照promise解析或拒绝的顺序逐个生成promise。比如: 有了这样消耗这个发电机的想法: 然而,我注意到,这将达到第二个promise,然后发电机将停止。这似乎是因为拒绝了“第二次”promise。当被拒绝时,在生成器中调用将在生成器中创建异常。 但这是我困惑的根源。我不想在这里创建异常,我只想

  • MDN文档 异步/等待函数的目的是简化同步使用promise的行为,并对一组promise执行某些行为。正如promise类似于结构化回调一样,async/await类似于组合生成器和promise。 我了解异步/等待、生成器和promise的基本概念。然而,我不完全理解说async/await类似于将生成器和promise结合起来意味着什么。 所以async/wait简化了生成器和promise

  • 问题内容: 承诺和生成器允许您编写异步代码。我不明白为什么在ECMA脚本6中同时引入了这两种机制。什么时候最好使用Promise?什么时候使用生成器? 问题答案: 这两种技术之间没有对立。它们共存并很好地互补。承诺使您能够获得尚不可用的异步操作的结果。它解决了厄运金字塔问题。所以代替: 你可以写: 但是即使有承诺,您也必须以异步方式编写代码- 您必须始终将回调传递给函数。编写异步代码比同步代码难得

  • 问题内容: 我知道defer分隔诺言状态的控制和过程,这里以Q为例,返回的诺言和完全不同,为什么这样设计?这两个“承诺”有什么区别 问题答案: 好吧,这是关于承诺解决方案源的。Q和其他许多库提供两个API: 旧版API-您可以在其中创建一个递延函数, 并承诺可以返回。 Promise构造函数 -这是现代API,您可以在其中从完成源创建Promise。 粗略地做: 是相同的: 所以你可能会问 为什么

  • 我试图理解为什么这段代码返回“Promise{pending}”。 当我通过reduceDirections()函数时,我可以看到我得到了想要的结果。但是当我(一行之后)时,我会改为“Promise pending” 很抱歉,我不理解promise和异步等待。我曾尝试在mdn上阅读和观看视频,但我不知道如何将它们显示的内容转移到这个问题上。提前感谢您的帮助!

  • 发电商的收益和promise中的哪一个。那么()是理解“等待”的更为正确的思维模式吗? 属性比较,通过使用调试器遍历下面的代码段来推断: 等待: > 等待promise实现。 将函数的其余代码包装在一个微任务中。 发电机产量: yield暂停正在运行的函数的执行。发电机功能不“运行到完成” 确保在执行剩余代码之前已结算 yield不会包装或创建微任务 许诺然后(回调): 不会暂停正在运行的函数的执