异步调用数据库for循环不等待

时间:2016-09-27 06:08:07

标签: javascript json node.js asynchronous callback

我只是在解析json时尝试访问数据库。这段小代码让我的生活充满了地狱

[
    {
        Id: 1,
        Name: 'Customer1',
        AddressId: 1,
        Address : 
        {
            Id: 1,
            Street: 'Some street'
        }
    },
    {
        Id: 2,
        Name: 'Customer2',
        AddressId: null,
        Address : null
    }
]

var value = {“旅行活动”:[1,2],“旅行风格”:[3,4]};

function loopColumns(val, cb){
    db.one('select tag_name from t_tag where tag_id = $1', val)
    .then(function (data) {
        //console.log(data.tag_name)
        cb(null, data.tag_name)
    });

}

这是输出
产量 旅游活动:
产量 旅行方式:
美食 美味的食物,Hicking
美食,Hicking,xyz
美食,Hicking,xyz,测试

  

我喜欢将输出视为
  旅游风格:美食,嘻嘻   旅行活动:xyz,测试

Plz拯救我的生命

2 个答案:

答案 0 :(得分:2)

使用Promise.all

  

Promise.all(iterable)方法返回一个promise,它在iterable参数中的所有promise都已解析时解析。

使用for-loop代替for-in循环来迭代array



function loopColumns(val, cb) {
  db.one('select tag_name from t_tag where tag_id = $1', val)
    .then(function(data) {
      cb(null, data.tag_name)
    });
}
var value = {
  "Travel Activity": [1, 2],
  "Travel style": [3, 4]
};
for (var i in value) {
  var output = '';
  var promiseArr = [];
  for (var j = 0, len = value[i].length; j < len; j++) {
    var promise = new Promise(function(resolve) {
      loopColumns(value[i], function(err, res) {
        resolve(res);
      });
    });
    promiseArr.push(promise);
  }
  Promise.all(promiseArr).then(function(arr) {
    var op = arr.join(', ');
    output += i + ' : ' + op + ' \n';
    console.log('output \n' + output);
  });
}
&#13;
&#13;
&#13;

答案 1 :(得分:1)

使用each实用程序模块中的async,而不是使用for循环。