Javascript 当承诺被多次解决并且共同例程具有下一个收益时,协同例程将如何表现

Javascript 当承诺被多次解决并且共同例程具有下一个收益时,协同例程将如何表现,javascript,node.js,generator,es6-promise,yield-keyword,Javascript,Node.js,Generator,Es6 Promise,Yield Keyword,对于promise&co例程,我在NodeJs中使用了bluebird npm包 当promise被多次解析时,请有人帮助理解下面代码的行为 问题: 当承诺多次得到解决时,协程会发生什么 第二个收益率将受到第一个收益率倍数的影响 const蓝鸟=需要(“蓝鸟”) 没什么resolve和reject作为一对匿名函数由promise构造函数发出。一旦其中一个被调用,对其中任何一个的进一步调用都将被忽略 注意:每次调用func1时都会调用新的间隔计时器,而不会停止以前启动的计时器,因此控制台输出看起

对于promise&co例程,我在NodeJs中使用了bluebird npm包

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

问题:

  • 当承诺多次得到解决时,协程会发生什么

  • 第二个收益率将受到第一个收益率倍数的影响

    const蓝鸟=需要(“蓝鸟”)

  • 没什么
    resolve
    reject
    作为一对匿名函数由promise构造函数发出。一旦其中一个被调用,对其中任何一个的进一步调用都将被忽略

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

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

  • 不,因为这个假设是不正确的。第一个收益不会多次收益,它返回一个承诺,该承诺在一秒钟后得到解决。它是在一个生成器函数中,在上一个产量(上次我检查时)之后的生产线上恢复。协同程序是在前一个收益中返回的承诺得到解决后调用生成器函数。有关更多详细信息,请参阅

  • 没什么
    resolve
    reject
    作为一对匿名函数由promise构造函数发出。一旦其中一个被调用,对其中任何一个的进一步调用都将被忽略

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

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

  • 不,因为这个假设是不正确的。第一个收益不会多次收益,它返回一个承诺,该承诺在一秒钟后得到解决。它是在一个生成器函数中,在上一个产量(上次我检查时)之后的生产线上恢复。协同程序是在前一个收益中返回的承诺得到解决后调用生成器函数。有关更多详细信息,请参阅


  • 谢谢你的回复。第一次解析承诺后,co例程将移动到下一行执行,然后解析将不会产生任何影响或内存损失?简短回答,是的。协同程序不会保留对承诺的引用,只会在每个承诺产生时调用其then方法。你不应该像保存任何东西一样,保存一个不断增长的、永久性的承诺对象或其解析/拒绝函数列表-这是另一个名称的内存泄漏。谢谢你的回复。第一次解析承诺后,co例程将移动到下一行执行,然后解析将不会产生任何影响或内存损失?简短回答,是的。协同程序不会保留对承诺的引用,只会在每个承诺产生时调用其then方法。您不应该像保存任何内容的列表一样,保存一个不断增长的、永久性的承诺对象或其解析/拒绝函数列表-这是另一个名称的内存泄漏。
    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);
        }
    });