我仍然很擅长为Node.js编写代码(来自PHP),有时很难理解异步操作是否正常工作,尤其是当存在多个嵌套数据库调用/异步操作时。
例如,在这段代码(使用mongo)中,只有在任何所需帐户上设置deleted
时,程序才会完成吗? (见todo
1,2和3):
// array of account emails to be compared against the accounts already in the database (using `email`)
var emailsArray;
accountsDatabase.find({}, {})
.then(function (accountsInDB) {
return q.all(_.map(accountsInDB, function (dbAccount) {
// compare account's email in db with emails array in memory using .email
if ((emailsArray.indexOf(dbAccount.email) > -1) === false) {
// todo 1. should there be another 'then' here or is 'return' ok in order for it to work asynchronously?
return accountsInDB.updateById(dbAccount._id, {$set: {deleted: true}});
} else {
// todo 2. is this return needed?
return;
}
}));
})
.then(function () {
// TODO 3. WILL THE PROGRAM POTENTIALLY REACH HERE BEFORE `deleted` HAS BEEN SET ON THE REQUIRED ACCOUNTS?
callback(); // all of the above has finished
})
.catch(function (err) {
callback(err); // failed
});
答案 0 :(得分:2)
是否应该有另一个'then',或者'return'确定它是否可以异步工作?
return accountsInDB.updateById(dbAccount._id, {$set: {deleted: true}});
如果您需要/需要,可以在此处链接另一个then
,但这并不重要。重要的是你return
来自函数的承诺,以便可以等待它。如果你没有,该函数仍然可以异步工作,但是不按顺序 - 它会在启动更新操作后立即继续。
需要退货吗?
else return;
不。它只返回undefined
,就像没有return
一样。您可以省略整个else
分支。
在
deleted
设置所需帐户之前,程序是否可以在此处获取?callback(); // all of the above has finished
不,它不会。 map
生成一个promise数组,q.all
生成一个等待所有promise的promise(并用它们的结果数组来实现)。 then
将等待在链接进行之前从其回调返回的这个承诺。