2017-06-07 4 views
1

私は4つの約束と最後に1つの機能を持っています。最後の機能は、チェーン内の以前の約束が解決される前に実行されています。約束が期待通りの順序で実行されていません - nodejs

なぜこのようなことが起こっているのか誰かが説明できますか?ここで

約束鎖である:

updateGdax(db) 
 
    .then(updateBitstamp(db)) 
 
    .then(updateBitfinex(db)) 
 
    .then(updatePoloniex(db)) 
 
    .then(coinMarketData.updateCoinMarketData(db)) 
 
    .then(addRates(db)); //this function is executing after the first promise in the chain.

私はそうaddRates(db)が最後に実行されなければならない、その前に列挙されたものの後に実行する各機能をしたいと思います。

将来の分析のために必要ならば、私はpromise関数からコードを投稿できますが、これはなぜ起こったのか理解したいと思っています。私の理解は、promiseチェーンの関数は実行されません。チェーンが解決しました。アプローチ以下

答えて

2

then呼び出しの更新関数が部分的に適用されない限り(関数を返さない限り)、関数は呼び出される前に実行されています。あなたは無名関数でそれらをラップして、それらを順番に実行させる必要があります。他の答えは言うことですかまたは脂肪の矢印を使用します。あなたのアップデート機能が完了した後、DBを返すように書き換えることができれば

updateGdax(db) 
    .then(()=>updateBitstamp(db)) 
    .then(()=>updateBitfinex(db)) 
    .then(()=>updatePoloniex(db)) 
    .then(()=>coinMarketData.updateCoinMarketData(db)) 
    .then(()=>addRates(db)); 

を、あなたはそうのような呼び出しを書き換えることができ、ポイントフリースタイル:

updateGdax(db) 
    .then(updateBitstamp) 
    .then(updateBitfinex) 
    .then(updatePoloniex) 
    .then(coinMarketData.updateCoinMarketData) 
    .then(addRates); 

各関数は、このようになります:

function updateGdax(db) { 
    return db.doSomething().then(()=> db) 
} 

は、そのパターンに従ってください、あなたは自分自身にいくつかの素晴らしい探しJavaScriptを持っています。

0

てみてください、これは動作します

updateGdax(db) 
    .then(function(){ 
    return updateBitstamp(db) 
    }).then(function(){ 
    return updateBitfinex(db); 
    }).then(function() { 
    return updatePoloniex(db); 
    }).then(function(){ 
    return coinMarketData.updateCoinMarketData(db) 
    }).then(function(){ 
    return addRates(db); 
    }).catch(function(err){ 
    console.log(err); 
    }); 

希望。いずれかの関数が値を返す場合、それを後続の関数で使用する場合は、その中で使用されているfunction()の値を渡します。参照:https://strongloop.com/strongblog/promises-in-node-js-an-alternative-to-callbacks/

2

、それははるかに直感的ですnodejs 8に含まれる新非同期/のawait、見て:

async function main() { 
    await updateGdax(db) 
    await updateBitstamp(db) 
    await updateBitfinex(db) 
    await updatePoloniex(db) 
    await coinMarketData.updateCoinMarketData(db) 
    await addRates(db) 
} 

main().catch(e => console.error(e)) 
関連する問題