2017-05-25 54 views
0

对于承诺&协程序,我已经在NodeJs中使用了蓝鸟npm包。当协议被多次解析并且协同程序有下一个收益时,协同程序将如何表现

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

问:

  1. 什么会发生在承诺解决的多次协同程序?

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

回答

2
  1. 没有。 resolvereject由promise构造函数发布为一对匿名函数。一旦他们中的一个人被叫,进一步打电话给他们任何一个都是忽略

    注意每次调用func1时都会调用新的间隔定时器,而不会停止先前启动的那些定时器,因此预期控制台输出看起来很乱。

    此外,每次致电func1时都会返回不同的新承诺。

  2. 否,因为该公式不正确。第一个收益率不会产生多次,它会返回一秒后解决的承诺。它在一个生成器函数中,它在上一次收益(上次检查时)之后的行中恢复。协程是关于在前一个收益返回的许诺得到解决之后调用生成器函数的。有关更多详细信息,请参阅http://bluebirdjs.com/docs/api/promise.coroutine.html

+0

感谢您的回复。第一次解决承诺后,协同例程将移至下一行执行,然后解决方案不会有任何影响或内存泄漏? – dearvivekkumar

+0

简短的回答,是的。协程不会保留对承诺的引用,只是在每个承诺产生时调用当时的方法。你不应该保留一个不断增长的,永久性的承诺对象列表或他们的解析/拒绝功能,而不是保留这样的列表 - 这是一个内存泄漏的另一个名字。 – traktor53