蓝鸟承诺 – 每个function

预先感谢您的帮助。

当使用蓝鸟承诺时,我有一系列的承诺运行。 在最后的承诺期间,我想为数组中的每个对象多次运行一个函数。

下面是伪代码:

var userArray = [ { name: "John", email: "John@email.com" }, { name: "Jane", email: "jane@email.com" }]; var functionOne = function() { //returns Promsie object }; var functionTwo = function() { //returns promise object }; var createUser = function(user) { return User.findOrCreate({email: user.email},{ name: user.name, email: user.email }); }; functionOne() .then(functionTwo) .each(createUser(userArray)) .then(function onComplete() { console.log("Complete"); }) .catch(function onError() { console.log("Um...it's not working"); }); 

我知道我没有正确使用每个function。 什么是正确的方式来实现这个使用蓝鸟?

据我所知,你想要从数组中的元素采取一些asynchronous行动。 那么请检查下面的例子:

 var Promise = require('bluebird'); function createUsersFromArray(userArray){ return Promise.each(userArray, function(signleUser){ return createUserFunction(signleUser); }); } 

要么

 return Promise.each(userArray, createUserFunction); functionOne() .then(functionTwo) .then(function(){ return createUsersFromArray(userArray); }) //or just .then(createUsersFromArray) if functionTwo return this array .then(function(createdUsers){ //here you may retrieve users and make some magic with them console.log(createdUsers); }) .then(function onComplete() { console.log("Complete"); }) .catch(function onError() { console.log("Um...it's not working"); }); 

我也推荐使用“全部”而不是“每个”

检查下面的例子:

 return Promise.all(userArray.map(function(singleUser){ return doSomethingWithUser(singleUser); })); 

要么

 return Promise.all(userArray.map(doSomethingWithUser)); 

如果所有的操作都正确的话,'all'会通知你。

如何使用承诺(最佳实践):

http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html https://blog.domenic.me/youre-missing-the-point-of-promises/

最直接的实现:

 functionOne() .then(functionTwo) .then(function(){ return bluebird.each(userArray, createUser); }) .then(function onComplete() { console.log("Complete"); }) .catch(function onError() { console.log("Um...it's not working"); }); 

如果你想访问所有这些创build的结果,你应该使用.map而不是.each。

感谢@Roman @Yuri的帮助! 我现在的工作代码如下:

 var userArray = [ { name: "John", email: "John@email.com" }, { name: "Jane", email: "jane@email.com" }]; var functionOne = function() { //returns Promise object }; var functionTwo = function() { //returns Promise object }; var createUser = function(singleUser) { //returns Promise object containing creating User }; functionOne() .then(functionTwo) .then(function() { return Promise.map(userArray, createUser); }) .then(function onComplete(response) { console.log("Complete:" + JSON.stringify(response)); }) .catch(function onError() { console.log("Um...it's not working"); });