2016-09-09 3 views
1

以前に要求された計算の結果に対して特定のAPIエンドポイントをポーリングするNode.js関数を記述する必要があります。その結果は生成されるまでにランダムな時間がかかり、まったく生成されないことがあります。私たちはできるだけ早くそれを手に入れたいと思っていますが、私はあまりにも長い間待たずにいたい、ということは、ある数のAPI呼び出しの後に関数が失敗する(Promiseを拒絶する)ことを意味します。失敗する前に結果をn回(試行間の遅延で)返す

私たちのコードとAPIとの間には一方向の通信があります。

const Bluebird = require('bluebird'); 

function getResult() { 
    return new Bluebird(async function (resolve, reject) { 

    let counter = 0; 

    while (counter < 10) { 
     await Bluebird.delay(1000); 

     const res = await apiCall(); 
     if (res.data) { 
     resolve(res.data); 
     } else { 
     counter += 1; 
     } 
    } 

    reject('timeout'); 
    }); 
} 

これは正しい方法ですか?

答えて

4

いいえこれはPromise constructor antipatternのasync/awaitバージョンです。 resolveを呼び出したときにループを停止することも、例外がスローされたときに拒否することもありません(たとえば、resnullの場合)。あなたは、ネイティブの1、ブルーバードの約束が返されることはないことを確認Bluebird.methodでラップやブルーバードを使用するようにtranspilerを伝えたい場合
あなたは

async function getResult() { 
    for (let counter = 0; counter < 10; counter += 1) { 
    await Bluebird.delay(1000); 
    const res = await apiCall(); 
    if (res.data) { 
     return res.data; 
    } 
    } 
    throw new Error('timeout'); 
} 

を使用する必要があります。

+0

ありがとうございます!我々は 'global.Promise = require(" bluebird ");'を持っています。ネイティブの約束を置き換えるのもいいですよね? – krl

+0

@krl「async」機能に影響を与えるべきではない本当のES6でしか見ていません。あなたのトランスペラレータが 'global.Promise'変数を使用している場合、それはまさに私が何を意味するのかです:-) – Bergi

関連する問題