Bluebird 承诺 - 每个功能
Bluebird promises - each function
在此先感谢您的帮助。
在使用 Bluebird 承诺时,我有一系列承诺 运行ning。在最后一个承诺中,我想 运行 为数组中的每个对象多次执行一个函数。
下面是伪代码:
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");
});
我知道我没有正确使用每个函数。使用 Bluebird 实现此功能的正确方法是什么?
据我了解,您想对数组中的元素执行一些异步操作。然后请检查以下示例:
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");
});
我还建议使用 "all" 而不是 "each"
查看以下示例:
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");
});
如果您想访问所有这些创建的结果,您应该使用 .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");
});
在此先感谢您的帮助。
在使用 Bluebird 承诺时,我有一系列承诺 运行ning。在最后一个承诺中,我想 运行 为数组中的每个对象多次执行一个函数。
下面是伪代码:
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");
});
我知道我没有正确使用每个函数。使用 Bluebird 实现此功能的正确方法是什么?
据我了解,您想对数组中的元素执行一些异步操作。然后请检查以下示例:
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");
});
我还建议使用 "all" 而不是 "each"
查看以下示例:
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");
});
如果您想访问所有这些创建的结果,您应该使用 .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");
});