javascript - 当 Promise 被多次解析且协程具有下一个 yield 时,协程将如何表现

标签 javascript node.js generator es6-promise yield-keyword

对于 Promise 和协同例程,我在 NodeJs 中使用了 bluebird npm 包。

当 promise 多次得到解决时,有人可以帮助理解以下代码的行为吗?

问题:

  1. 当 Promise 多次解析时,协程会发生什么?

  2. 第二个产量是否会受到第一个产量倍数的影响?

    const bluebird = require("bluebird");

    function func1() {
        return new bluebird((resolve, reject) => {
            let c = 0;
            let iterval = SetInterval(() => {
                c++;
                let cc = c;
                console.log(`c=${c}`);
                if(cc === 20) {
                        clearInterval(interval);
                }
                resolve(true);
            }, 1000);
        });
    }
    
    let run1 = bluebird.coroutine(function*() {
        try {
            yield func1();
            yield func1();
            yield func1();
            yield func1();
        } catch (e) {
            console.dir(e);
        }
    });
    

最佳答案

  1. 什么也没有。 resolvereject 由 Promise 构造函数作为一对匿名函数发出。一旦其中一个被调用,对其中任何一个的进一步调用将被忽略

    请注意,每次调用 func1 时都会调用新的间隔计时器,而不会停止之前启动的计时器,因此控制台输出看起来会很困惑。

    此外,每次调用 func1 都会返回一个不同的新 Promise。

  2. 不,因为假设不正确。第一个yield不会多次yield,它返回一个在一秒后解决的promise。它位于生成器函数中,该函数在上一个yield(我上次检查时)之后的行处恢复。协程的作用是在前一个yield中返回的promise确定后调用生成器函数。请参阅http://bluebirdjs.com/docs/api/promise.coroutine.html了解更多详情。

关于javascript - 当 Promise 被多次解析且协程具有下一个 yield 时,协程将如何表现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44179760/

相关文章:

javascript - jQuery 验证脚本和覆盖阻止来自 'submitting' 的页面

javascript - 模型销毁调用不正确的 REST url

python - 当你调用一个包含 yield 的函数时会发生什么?

matrix - 从 ldpc 奇偶校验矩阵生成生成器矩阵

javascript - AngularJS,Javascript - 如何比较 mm-yyyy 格式的两个日期?

javascript - 上一个/下一个 按类别隐藏和显示 div

javascript - Twitter Bootstrap 模式输入字段焦点

javascript - 如果未发送,请重试发送邮件

node.js - 无法使用 docker-compose 挂载 mongodb 目录卷

python - 与 itertools.dropwhile 相反(如何在 N 次迭代后停止生成器)