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