2 回答

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個贊
因?yàn)榛卣{(diào)函數(shù)的特點(diǎn)就是無需等待,且回調(diào)執(zhí)行的時間也不確定。你這里出現(xiàn)這種輸出順序的原因是執(zhí)行addComments時花了些時間。
如果你想要按Added a campground、Created new comment這樣交替打印的話,就需要等待前一個 comment完成再執(zhí)行下一個capmgroup的添加了。這就放棄了js異步的優(yōu)勢。現(xiàn)在data數(shù)據(jù)只有三個不算多,但是數(shù)據(jù)一多就會影響體驗(yàn),用戶會看到最后面的comment添加的比第一個遲的多。
代碼的話可以用Promise:
function addComments(campground, cmt,resolve) {
Comment.create(cmt, function(err, comment) {
if (err) console.log(err);
else {
campground.comments.push(comment);
campground.save();
console.log("Created new comment");
resolve();
}
});
}
function new_addCamps(seed) {
return new Promise((resolve, reject) => {
Camp.create(seed, function(err, campground) {
if (err) reject(err);
else {
console.log("Added a campground");
addComments(campground, cmt,resolve);
}
});
});
}
同時不能再使用forEach而是使用for循環(huán):
(async function (){
for(let i=0;i<data.length;i++){
await addCamps(data[i]);
}
})();

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個贊
樓上正解,舉個簡單的例子
for (var i=0;i<3;i++){
setTimeout(function(){console.log(i)},100)
}
你覺得輸出結(jié)果是什么?
答案是三個3
異步回調(diào),普通的回調(diào)是沒問題的,就是把setTimeout去掉,變成一個閉包函數(shù)。
輸出是0,1,2
但是異步回調(diào)會讓事件輪詢的順序產(chǎn)生變化。
特別詳細(xì)的去百度一下Js的事件輪詢機(jī)制吧
添加回答
舉報