Nodejs和Mongoose等待文件在回调之前保存

时间:2017-11-14 17:26:42

标签: javascript node.js mongodb asynchronous mongoose

以下函数采用包含多个用户ID数组的聚合游标,以便可以修改并保存具有相应ID的用户。

我遇到的问题是,只有在修改并保存所有用户后才能返回该功能。目前它并没有这样做,当我稍后尝试访问用户时(字面意思是在此功能之后),修改尚未完全渗透。

这是进行修改的当前代码(可能是一些奇怪的异步添加,因为我尝试了10个不同的选项而没有成功):

function updateUsers(dataArray, done) {


dataArray.eachAsync(
 function(data) {
  let userArray = data.users;     

  async.forEach(userArray, function(userId, callBack){       

    mongoose.model('User').findById(userId, function(err, user) {
      // User document modified         
      user.save(function(err, user){
        callBack();
      });        
    });
  });
},
function(err) {
  //Only come here once all the users have been modified and saved!
  if (err) {
    return done(err, false);
  }

  return done(err, true);
  } 
 );
}

传递的数据是:

  

dataArray:聚合光标

eachAsync的结果,例如数据是:

{ _id: 'GroupValue',
users: 
 [ 5a0b2f5bcd0813adeac2435b,
   5a0b2f5bcd0813adeac24357,
   5a0b2f5bcd0813adeac24358 ] }

1 个答案:

答案 0 :(得分:0)

在每次回调迭代后,您通过回调调用return语句。因此,您将返回userArray.length次。

如果您只想插入数据并且不希望使用它的函数知道它们是否成功插入,您可以在迭代循环之前立即进行回调。

function updateUsers(dataArray, done) {


dataArray.eachAsync(
 function(data) {
  let userArray = data.users;     

  callBack();
  async.forEach(userArray, function(userId, callBack){       

    mongoose.model('User').findById(userId, function(err, user) {
      // User document modified         
      user.save(function(err, user){
        //do nothing
      });        
    });
  });
},
function(err) {
  //Only come here once all the users have been modified and saved!
  if (err) {
    return done(err, false);
  }

  return done(err, true);
  } 
 );
}

否则,假设您只想在最后次迭代后专门回调。你可以做的一个肮脏的方法是在循环之外做一个临时变量,在循环中执行if语句,在最后一次迭代中执行。

对于此实现,您必须假设该函数永远不会传递非零长度的用户数组。否则,它永远不会运行单次迭代,也不会终止。 (你想写一个if length == 0 case)

function updateUsers(dataArray, done) {


dataArray.eachAsync(
 function(data) {
  let userArray = data.users;     
  let tempVar = 0;

  async.forEach(userArray, function(userId, callBack){       

    mongoose.model('User').findById(userId, function(err, user) {
      // User document modified         
      user.save(function(err, user){
        tempVar++;
        if(tempVar == userArray.length) {
          callBack(); 
        }
      });        
    });
  });
},
function(err) {
  //Only come here once all the users have been modified and saved!
  if (err) {
    return done(err, false);
  }

  return done(err, true);
  } 
 );
}
},
function(err) {
  //Only come here once all the users have been modified and saved!
  if (err) {
    return done(err, false);
  }

  return done(err, true);
  } 
 );
}