【发布时间】:2018-12-02 11:00:45
【问题描述】:
我正在尝试等待循环中的所有数据库调用完成,然后再继续。我将每个调用(即承诺)添加到一个数组中,然后使用Promise.all() 等待所有调用。但是,有嵌套的 DB 调用,如 user.increment() 或 user.create(),Promise.all() 似乎并没有等待。这个 sn-p 的输出通常是:
User found, incrementing wins...
Promise.all()
User updated
Promise.all 块在嵌套 DB 调用完成之前运行。我觉得我错过了一些非常简单的东西。
let dbCalls = [];
for(var i = 0; i < users.length; i++){
let messageUser = users[i];
//try to find user by id
dbCalls.push(db.user.findOne({
where: {
id: messageUser.id
}
}).then(function(user){
if(user){
//found user, increment them
user.increment('wins').then((user) => {
console.log('User found, incrementing wins...');
user.reload();
}).then(user => {
console.log('User updated')
return user;
});
} else{
//user wasn't found, create them
console.log(`${messageUser.username} was not found, creating user...`);
db.user.create({
username: messageUser.username,
id: messageUser.id,
wins: 1
}).then(function(user){
console.log('created user');
return user;
});
}
}).then(res => {
return res;
})
);
}
Promise.all(dbCalls).then(res =>{
console.log('Promise.all()' + res);
});
【问题讨论】:
-
你需要瀑布式调用,因为它们需要按顺序触发
-
能否请您发布输出。
-
除非您使用的是非常旧的节点版本,否则只使用
let value = await doSomeFunction()并继续下一行而不是到处都有.then()更容易。
标签: javascript node.js promise