【问题标题】:async call to database for loop not wait对数据库的异步调用循环不等待
【发布时间】:2017-02-04 15:25:29
【问题描述】:

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

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)
    });

}

var value = {"旅行活动":[1,2], "旅行方式":[3,4]};

for( i in value){ 
    //console.log(value[i], i)
    var output = '';
    var outcome = '';
    var str = value[i];
    for(j in str){
        loopColumns(str[j], function(err,res){
            if(outcome=='') outcome= res;
            else outcome= outcome+' , '+res;
            console.log(outcome);
        })

    }

    var output = i+' : '+outcome+' \n';
    console.log('output \n'+output);
};

这是输出
输出 旅游活动:
输出 旅游方式:
好食物
美味的食物,希金
美食 , 希克 , xyz
美食 , Hicking , xyz , 测试

我喜欢输出为
旅行方式:美食,Hicking
旅行活动:xyz,测试

请救救我的命

【问题讨论】:

  • 使用Promise..
  • 删除var output的重复声明
  • 我已经在使用 promise,这是异步行为的问题
  • 你应该提供完整的例子......不完整的代码无济于事......

标签: javascript json node.js asynchronous callback


【解决方案1】:

使用Promise.all

Promise.all(iterable) 方法返回一个 promise,当 iterable 参数中的所有 promise 都已解析时,该 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);
  });
}

【讨论】:

  • @shivshankar — 我很高兴它有帮助! 快乐编码
  • 请帮我访问for-in循环外的输出变量以导出其他模块
  • @shivshankar – 你的模块函数应该有一个callback
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 2020-08-02
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2019-06-02
    相关资源
    最近更新 更多