2015-09-09 51 views
0

我使用Sequelize,它使用Bluebird承諾並需要迭代對象數組(每次插入它們 - bulkCreate無法處理mssql上的重複檢查)。承諾:遍歷數組

它看起來是這樣的:

var users = [.....] // Filled up somewhere else. 

Product.create(model) 
    .then(function() { 
     return users; 
    }) 
    .each(function(user) { 
     return User.create(......); 
    }) 

我的問題是:是否確定要返回的東西陣列(未承諾)就像我的怎麼辦呢?

編輯:另一個例子

這裏是另一個,更好,例如,我試圖做(與這個例外是的setTimeout(),而不是數據庫寫入)。它看起來像它的作品。它接受數組中的每個元素(2,3,4)並執行send()函數。

var Promise = require("bluebird"); 
function myDelay(who) { 
    var deferred = Promise.pending(); 

    console.log("Starting: " + who); 

    setTimeout(function() { 
     console.log("Done with: " + who); 
     deferred.resolve();   
    }, 250); 

    return deferred.promise; 
} 

myDelay("one") 
    .then(function() { 
     return ["two", "three", "four"]; 
    }) 
    .each(function(who) { 
     return myDelay(who); 
    }) 
    .then(function() { 
     console.log("All done!"); 
    }); 

它在我看來,它的工作正常。輸出如下:

Starting: one 
Done with: one 
Starting: two 
Done with: two 
Starting: three 
Done with: three 
Starting: four 
Done with: four 
All done! 

每個「數字」之間有一個小的延遲。

+0

你想達到什麼目的 - 代碼看起來不會工作 - 它做什麼? –

+0

它是僞代碼(種類)...我想爲數組中的每個項目執行一次數據庫插入調用。 – Sten

+0

如果你返回一個值,那不是來自'then()'的Promise,這個值將被一個Promise包裝。所以你的代碼不會按照你的意圖工作。 – Sirko

回答

1

可以從then回調中返回一組東西(而不是承諾)嗎?

是的,這是完全沒問題的。然後,返回的promise將直接使用該回調返回值進行解析,而不是以某種承諾的結果進行解析。作爲其同化過程的一部分,then確實將承諾與非承諾自動區分開來。這裏返回的users數組在這方面與undefined沒有什麼不同,即您的最後(日誌記錄)回調返回。

你的第二個例子是完全正確的,只有在你的第一個例子中,我有點擔心「填充在其他地方」 - 你應該保持儘可能的本地化。 users實際上並不取決於Product.create(model)承諾的結果,所以讓他們在那裏進行回調有點奇怪。