变量i未填充

时间:2016-08-20 04:13:43

标签: node.js express mongoose

我先声明变量。但是如果我做console.log(userinsertData)外部循环变量仍然没有填充。 我应该怎么做才能解决这个问题? 在这里我的代码:

var User = require('../models/user');

module.exports = {
  myaction: function(req, res, next) {
    var data = req.body,
      userinsertData = [];
    try {
      data.forEach(function(item, index) {
        var userdata = new User();
        userdata.name = item.name;
        userdata.age = item.age;
        userdata.sex = item.sex;
        userdata.save(function(err, data) {
          if (err) {
            res.send(err)
          } else {
            userinsertData.push(data);
          }
        });
      })
    } catch (e) {
      res.json({
        message: 'data not valid'
      })
    }
    console.log(userinsertData);
    res.json({
      message: 'musician created!',
      data: userinsertData
    });
  }
};

2 个答案:

答案 0 :(得分:0)

    you should solve the problem as
    async.eachSeries(data, function (info, callback) {
                   //here process your data and call callback() for next iteration

                  }, function (err) {
                    if (err) {
//this will be called after all iterations and in case of error
                    }else{
                      console.log('Well done :-!');
    //this will be called after all interations successfully
                    }

                  });

你遇到的这个问题是因为nodejs的异步性质,而async可以帮助你引入阻塞。

不要忘记包含异步

答案 1 :(得分:0)

使用承诺

var User = require('../models/user');

module.exports = {
  myaction: function(req, res, next) {
    var data = req.body,
      userinsertData = [];

    new Promise(function(resolve, reject) {
      data.forEach(function(item, index) {
        var userData = new User(item);
        userData.save(function(err, data) {
          // if error, reject
          if(err) return reject(err);
          // we have proceed all items in data, resolve it
          else if(data.length - 1 === index) return resolve(userinsertData);
          // not finished yet, keep proceeding
          else userinsertData.push(data);
       });
    }).then(function(successResult) {
      res.json({
        message: 'musician created!',
        data: successResult
      });
    }, function(errorResult) {
      res.json({
        message: 'data not valid'
      });
    });
  }
};

使用回调

var User = require('../models/user');

module.exports = {
  myaction: function(req, res, next) {
    var data = req.body,
      userinsertData = [];

    function saveUser(callback) {
      data.forEach(function(item, index) {
        var userData = new User(item);
        userData.save(function(err, data) {
          // if error, return callback with error
          if(err) return callback(err);
          // we have proceed all items in data, return data
          else if(data.length - 1 === index) callback(null, userinsertData);
          // not finished yet, keep proceeding
          else userinsertData.push(data);
       });
    }

    saveUser(function(err, users) {
      if(err) return res.json({message: 'data not valid'});
      res.json({
        message: 'musician created!',
        data: users
      });
    });
  }
};

这是async包在内部执行的操作