承诺链未按预期顺序执行 - nodejs

时间:2017-06-07 13:52:40

标签: node.js

我有4个承诺链,最后有1个功能。最终功能在链中的先前承诺解决之前执行。

有人可以向我解释为什么会发生这种情况吗?

这是承诺链:

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函数中的代码,但我真的只是想了解为什么会发生这种情况,因为我的理解是,除非先前的承诺,否则承诺链中的函数将不会执行。连锁店已经解决了。

3 个答案:

答案 0 :(得分:2)

除非部分应用then调用中的那些更新函数(除非它们返回一个函数),否则它们将在调用then之前执行。您需要将它们包装在匿名函数中,以便按顺序执行它们。做其他答案所说的或使用胖箭:

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

如果你的更新函数可以被重写以在完成后返回db,那么你可以重写这样的调用,点自由样式:

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

每个函数看起来都像这样:

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

遵循这种模式,你有一些漂亮的javascript。

答案 1 :(得分:2)

看看nodejs 8中包含的新的async / 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))

答案 2 :(得分: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);
  });

希望这会奏效。如果任何函数返回任何值,并且如果要在后续函数中使用它,那么在下面使用的函数()中传递该值。请参阅:https://strongloop.com/strongblog/promises-in-node-js-an-alternative-to-callbacks/