当 promise 被多次解析并且协程有下一个 yield 时,协程将如何表现

How will coroutine behaves when the promise is resolved multiple times and co-routine have next yield

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

当 promise 被多次解析时,有人可以帮助理解以下代码的行为。

问题:

  1. promise多次resolve时协程会发生什么?

  2. 第2次的收益率会不会受到第1次收益率的倍数影响

    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 returns 都是一个不同的新承诺。

  2. 否,因为假设不正确。第一次 yield 不会多次 yield,它 returns 一秒钟后解决的承诺。它在一个生成器函数中,它在上一个 yield 之后的行恢复(我最后一次检查)。协程是关于在之前的 yield 中返回的 promise 完成后调用生成器函数。有关详细信息,请参阅 http://bluebirdjs.com/docs/api/promise.coroutine.html