2017-05-25 28 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