我正在使用水線+帆爲一個API,我有以下函數嵌套exec()
調用。嵌套的異步JavaScript函數
AcademyService.getAll().exec(function (error, data) {
if (error) {
return res.json({result: false, message: error});
}
var academies = data;
for (var i = 0; i < Object.keys(academies).length; i++) {
var user_id;
user_id = academies[i].academy_user_id;
(function (index) {
UserService.getOneById(user_id).exec(function (error, data) {
if (error) {
academies[index].academy_user_id = null;
}
academies[index].academy_user_id = data.user_fname+" "+data.user_lname;
});
})(i);
}
return res.json({result: true, academies: academies});
});
上面代碼的問題是,最後一個return語句沒有更新academies
對象。即它的academy_user_id
沒有更新的值。我將其歸因於調用的異步行爲,我認爲當我們達到最後一次返回時,UserService
的異步調用仍在循環中運行,並且更新的academies
對象未傳遞。
現在,草率的解決方案是將回調UserService.getOneById
回調中的academies
對象用循環結束檢查返回,但這似乎不是正確的方法。那麼,我們可以以某種方式同步執行內部exec()
嗎?
一個很酷的解決辦法是使用承諾:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise –