2013-07-02 113 views

回答

-1

查看帖子@rquinn,如果docs[i].save()未返回承諾,則此代碼可能實際上不起作用。

var tasks = []; 

for (var i=0; i < docs.length; i++) { 
    tasks.push(docs[i].save()); 
} 

Q.all(tasks) 
    .then(functions, function(results) { 
    console.log(results); 
    }, function (err) { 
    console.log(err); 
    }); 

我們在循環中一次啓動一個操作,但我們不等待它們中的任何一個完成,因此它們並行運行。我們爲數組添加一個承諾(就像結果的佔位符一樣)。然後,我們等待承諾數組中的所有承諾完成。

+3

我們確定這可以工作嗎?保存不會返回一個承諾,它是異步的,所以我認爲Q.all.then()將在記錄實際插入之前被調用。也許這對你來說不是問題。我在Q.all.then()中調用了process.exit,並沒有插入記錄。 –

+0

啊,我以爲'.save'已經回覆了一個承諾。如果不是,那麼你的解決方案確實是正確的。 – ForbesLindesay

2

請參閱我對使用ForbesLindesay的解決方案遇到的問題的評論。這裏是我結束了(剛剛添加ninvoke返回一個承諾):

var tasks = []; 

for (var i=0; i < docs.length; i++) { 
    tasks.push(Q.ninvoke(docs[i], "save")); 
} 

Q.all(tasks) 
.then(functions, function(results) { 
    console.log(results); 
}, function (err) { 
    console.log(err); 
});