节点js:我在for循环中追加变量时得到空数组

时间:2018-01-19 07:09:42

标签: javascript node.js

我在for循环中获取空数组,而我在循环中追加变量

let data_info1 = '';
for (let i = 0; i < data.length; i++) {
    var query = { '_id': mongoose.Types.ObjectId(data[i].coin_id) };
    var coin_data = coin_model.find(query, function (err, info) {
        var a = {}
        a['coin_name'] = info[0].coin_code;
        a['data_info'] = data[i];

        var myJsonString = JSON.stringify(a);
        data_info1 += JSON.parse(myJsonString);
    });
}
console.log(data_info1)

2 个答案:

答案 0 :(得分:3)

您在JSON.parse / stringify中遇到问题,在循环期间没有必要= /

看起来会更好:

let data_info1 = [];
for (let i = 0; i < data.length; i++) {
    var query = { '_id': mongoose.Types.ObjectId(data[i].coin_id) };
    var coin_data = coin_model.find(query, function (err, info) {
        var obj = {
            coin_name: info[0].coin_code,
            data_info: data[i]
        };

        data_info1.push(obj);
    });
}
console.log(JSON.stringify(data_info1))

此外,问题是coin_model.find是同步还是异步?如果它是异步的,那么在循环之后就不可能console.log,它将显示空结果=(

如果它是异步的,你需要将你的代码结构略有不同,并理解JS中的异步编码原理(例如使用Promises)。

const promiseList = [];
for (let i = 0; i < data.length; i++) {
    var query = { '_id': mongoose.Types.ObjectId(data[i].coin_id) };

    promiseList.push(new Promise(function(resolve, reject) {
        coin_model.find(query, function (err, info) {
            if (err) reject(err);

            var obj = {
                coin_name: info[0].coin_code,
                data_info: data[i]
            };

            resolve(obj);
        });
    }));
}

// wait till all coin requests will be finished
Promise.all(promiseList).then(function(results) {
    console.log(results);
});

注意if (err) reject(err)resolve(obj)Promise.all。这对你来说可能非常棘手= /另外,在data.length非常庞大(> 100个元素)的情况下,你会立即向你的数据库发出100个请求,这不是很酷=(可能是你需要组织请求队列。

以下是Promise.all API https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

的文档

答案 1 :(得分:2)

这是因为您的循环执行速度非常快而且coin_model.find(query, function (err, info) {不会导致该时间

  你可以这样做   这是doc的链接   async

// Import async module
  async = require('async');      

  async.eachOfSeries(data,
    // Each item in array you can get here
    function (item, index, cb) {

      var query = { '_id': mongoose.Types.ObjectId(item.coin_id) };

      var coin_data = coin_model.find(query, function (err, info) {

        if (err) {
          return cb(err)
        } else {
          if(Array.isArray(info) && info.length > 0){
            var a = {}
          a['coin_name'] = info[index].coin_code;
          a['data_info'] = data[index];
          var myJsonString = JSON.stringify(a);
          data_info1 += JSON.parse(myJsonString);
           cb()
          } else {
            cb('No result found in database')
          }
        }

      });

    },
    //this is the final callback
    function (err, result) {

      //ii final callback here 
    })