node.js中的嵌套异步操作

时间:2016-05-05 15:47:32

标签: javascript node.js mongodb asynchronous promise

我仍然很擅长为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
    });

1 个答案:

答案 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将等待在链接进行之前从其回调返回的这个承诺。