2017-05-25 5 views
0

約束&コルーチンのために、私が使用したブルーバードNPMパッケージを持って解決されたときコルーチンの動作になります。どのような約束が複数回とコルーチンはNodeJsの次の歩留まり

約束が複数回解決された場合、以下のコードの動作を理解するのに助けてください。

質問:約束は複数回解決したときにコルーチンはどう意志

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

答えて

2
  1. 何もありません。 resolveおよびrejectは、プロミス・コンストラクタによって一対の無名関数として発行されます。そのうちの1つが呼び出されると、いずれかの呼び出しにはが無視され、さらにが呼び出されます。

    注新しいインターバルタイマーは、以前に開始したものを停止することなく、呼び出されるたびfunc1と呼ばれるので、コンソール出力が乱雑に見えることを期待しています。

    またfunc1への各呼び出しは異なる、新しい約束を返します。

  2. 仮定が正しくないため、いいえ。最初の歩留まりは何回も返されません。1秒後に解決される約束を返します。これはジェネレータ関数内にあり、前回の利回り後の行から再開します(最後にチェックした時)。コルーチンは、前回の歩留まりで返された約束が解決された後、ジェネレータ関数を呼び出すことに関するものです。詳細はhttp://bluebirdjs.com/docs/api/promise.coroutine.htmlを参照してください。お返事のための

+0

感謝。約束が最初に解決された後、コルーチンは実行のために次の行に移動し、解決は影響も記憶もしません。 – dearvivekkumar

+0

短い答え、はい。コルーチンは、約束の参照を保持しておらず、各約束のthenメソッドを返すだけです。 promiseオブジェクトやその解決/拒否機能の永続的なリストは、何かのリストを保持する以上のものを保持するべきではありません。別の名前によるメモリリークです。 – traktor53

関連する問題