0

对于 promise & co-routine,我在 NodeJs 中使用了 bluebird npm 包。

当多次解决承诺时,有人可以帮助理解以下代码的行为。

问题:

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

  2. 会不会第二次的收益率会受到第一次的倍率的影响。

    常量蓝鸟 = 要求(“蓝鸟”);

    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);
        }
    });
    
4

1 回答 1

2
  1. 没有。resolve并由rejectpromise 构造函数作为一对匿名函数发出。一旦其中一个被调用,对其中任何一个的进一步调用都会被忽略

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

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

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

于 2017-05-25T12:34:43.510 回答