2017-07-03 284 views
2

我是nodejs的新手。请帮助我如何将数据保存在foreach循环中并将响应发送回controller.it返回false而不返回对象。在此先感谢如何在nodejs的foreach循环中编写顺序执行?

这里是我的代码就像

var rideStatus = require('../models/ridestatus'); 
module.exports = { 
    invite_ride: function* (body) { 
    var saved = false; 
    var receivers = body.uids; 
    receivers = receivers.split(',').filter(function(n) { return n != 'null'; }); 
    receivers.forEach(function* (n) { 
     yield rideStatus.findOne(
     {$and: [{ride_id: body.rideid}, {receiver_id: receivers}]}, 
     function(err, doc) { 
      if (doc === null) { 
      new rideStatus({ 
       ride_id: body.rideid, 
       invited_id: body.userId, 
       receiver_id: receivers, 
      }).save(function(err1, ridestatus) { 
       if (!err1) { 
       rideStatus.findOne({_id: ridestatus._id}). 
        populate('ride_id'). 
        populate('invited_id'). 
        populate('receiver_id'). 
        exec(function(err2, user) { 
        // console.log(user); 
        if (user != null) { 
         saved = user; 

        } 
        }); 
       } 
      }); 
      } 
     }); 
    }); 
    return saved; 
    }, 
}; 

回答

1
因为Node.js的的你“回归保存”语句的异步特性

不会等待你的I/O完成他的工作。还要注意如果你有多个值要保存,你应该返回一个保存的Users对象数组。

var rideStatus = require('../models/ridestatus'); 
module.exports = { 
    invite_ride: function* (body) { 
     var savedUsers = []; 
     var receivers = body.uids; 
     receivers = receivers.split(',').filter(function(n) { return n != 'null'; }); 
     var len = receivers.length 
     var i=0 
     receivers.forEach(function* (n) { 
      yield rideStatus.findOne(
       {$and: [{ride_id: body.rideid}, {receiver_id: receivers}]}, 
       function(err, doc) { 
        if (doc === null) { 
         new rideStatus({ 
          ride_id: body.rideid, 
          invited_id: body.userId, 
          receiver_id: receivers, 
         }).save(function(err1, ridestatus) { 
          if (!err1) { 
           rideStatus.findOne({_id: ridestatus._id}). 
            populate('ride_id'). 
            populate('invited_id'). 
            populate('receiver_id'). 
            exec(function(err2, user) { 
             // console.log(user); 
             if (user != null) { 
              savedUsers.push(user); 
             } 
             if(i==len-1) 
              return savedUsers; 
             else 
              i++ 
            }); 
          }else{ 
           i++ 
          } 
         }); 
        }else{ 
         i++ 
        } 
      }); 
     }); 
    }, 
}; 
+0

做工精细,非常感谢你 – siva

+0

欢迎你,请你接受的答案;-) – tashakori

+0

是的,我接受 – siva

相关问题