NodeJS同步故障

时间:2017-09-19 18:18:38

标签: javascript node.js asynchronous synchronous

使用NodeJS,我试图从ID列表中获取数据信息并填充对象数组。我需要这个同步处理。我无法弄清楚如何执行此操作,因此下一个函数调用将在被调用之前等待前一个函数调用完成。然后所有的'每个'迭代完成返回被调用。

示例:

group by

这是一个简化的示例,因此假设获取所有信息的单个查询将无法正常工作,因为有多个连接正在进行并且后处理需要在js中进行。另外,假设我正在进行适当的错误处理,我在我的示例中省略了。

3 个答案:

答案 0 :(得分:0)

您的数据库查询是异步的,因此您需要使用回调或承诺在数据库返回结果后执行您的工作。

function getListOfIDs(callback) {
  // database call to get IDs
  db.query('...', function(data) {
    // call the callback and pass it the array
    callback(data);
  });
}

function getInfo() {
  // pass an anonymous function as a callback
  getListofIDs(function(data) {
    // we now have access to the data passed into the callback
    console.log(data);
  });
}

答案 1 :(得分:-1)

您当前的代码示例是同步的,但我不知道您的db代码是如何工作的。每个循环是同步的,它只是迭代你的id并调用getFullInfo函数。

我不确定你为什么要同步代码,因为它没有使用节点事件循环架构。

我要做的是使用一个好的Promises框架,比如Bluebird(http://bluebirdjs.com/docs/api/promise.each.html)和Promise.each,确保每次迭代都是连续发生的。或者您也可以使用async(http://caolan.github.io/async/)等回调库与async.eachSeries。这些中的任何一个都将确保您(a)获得异步的好处和(b)以串行方式迭代。

答案 2 :(得分:-2)

承诺这样做:

function getListOfIDs() {
  return new Promise((resolve, reject) => {
       // database call
       if (err) 
       {
           reject(your_db_err);
           return;
       }
       resolve(your_db_result);
  });
}

function getInfo() {
    getListOfIDs().then((result) => {
        //do whatever you want with result
    })
    .catch((err) => {
        //handle your err
    });
}