2017-09-25 7 views
1

私はプロミスライブラリを学習していますが、次の問題を抱えています。プロミスがタイムアウトを待たずに

//Function for getting sum 
    function getSum(n1, n2) { 
     var isAnyNegative = function() { 
      return n1 < 0 || n2 < 0; 
     } 
     var promise = new Promise(function(resolve, reject) { 
      if (isAnyNegative()) { 
      reject(Error("Negatives not supported")); 
      } 
      resolve(n1 + n2) 
     }); 
     return promise; 
    } 

////Function for getting Difference 
    function getDiff(n1,n2){ 
     var diff = n1-n2; 
     setTimeout(function(){ 
      console.log("value of diff--- ", diff) 
      return diff; 
     }, 2000) 
    } 

    getSum(5,6) 
    .then(function(callbackResult){ 
     console.log("first callback-Result- ", callbackResult) 
     return getDiff(14,11); 
    }, function(error){ 
     //handling error 
    }) 
    .then(function(callbackResult){ 
     console.log("second callback--Result- ", callbackResult) 
     return getSum(22,22); 
    }, 
    function(error){ 
     //handling error 
    }) 
    .then(function(callbackResult){ 
     console.log("third callback--Result- ", callbackResult) 
    }, function(error){ 
     //handling error 
    }) 

私はこのコードスニペットのために取得しています出力: -

first callback-Result- 11 
second callback--Result- undefined 
third callback--Result- 44 
value of diff--- 3 

なぜ2番目のコールバックを返すために差関数を待ちません。私はこれがコードを同期するPromiseライブラリの主な機能だと思います。

+2

はい、ちょっとです。しかし、setTimeoutも非同期呼び出しです –

+0

@GrégoryNEUTの答えを見てください。実際にタイムアウトに戻ると、diff関数には戻りません。例えば、 'map'メソッドにも同じことが当てはまります。 'function x(){ array.map(function(el){return el}); } ' ' x() 'を呼び出すと、リストの最初の要素は返されません。 – SBylemans

答えて

4

setTimeoutを非同期で処理する必要があります。たとえば、次のように

function getDiff(n1,n2){ 
    return new Promise((resolve) => { 
     const diff = n1 - n2; 

     setTimeout(() => { 
      console.log('value of diff--- ', diff); 

      return resolve(diff); 
     }, 2000); 
    } 
}); 
+0

[Bluebird](http://bluebirdjs.com/docs/api/promise.delay.html)ライブラリを使用している場合は、2秒待ってから 'Bluebird.delay(2000)'を使用することもできます返された約束を解決します。 – Griffin

+0

@Griffinそうすることはできますが、 'node.js'が' Promises'をネイティブでサポートするときに 'Bluebird'を使う理由は何ですか? –

+1

間違いなく良い点は、es6は新しいものをたくさん得ています。 1.サーバーの環境とノードのバージョンを制御することはできますが、ユーザーがあなたのWebサイトを訪問したブラウザを制御することはできません。そのため、したがって、これらの機能を使用するフロントエンドのコードがあれば、Safariでさえそれらをサポートしないことがあります。これらのライブラリはあなたのためにpolyfillすることができますので、心配する必要はありません。 2.これらのユーティリティー・ライブラリーは私の入力を節約し、実行していることを理解するのは簡単です。 – Griffin

0

あなたはタイムアウト内部匿名関数で差分を戻ってきているので。約束を待っていたい場合は、前もってgetSumのようにgetDiffからPromiseインスタンスを返す必要があります。

function getDiff(n1,n2){ 
    var diff = n1-n2; 
    return new Promise(function(resolve, reject) { 
     setTimeout(function(){ 
      console.log("value of diff--- ", diff) 
      resolve(diff); 
     }, 2000); 
    }); 
} 
関連する問題