Javascript NodeJS同步故障

Javascript NodeJS同步故障,javascript,node.js,asynchronous,synchronous,Javascript,Node.js,Asynchronous,Synchronous,使用NodeJS,我试图从数据库中获取ID列表上的信息,并填充一个对象数组。我需要同步处理这个。我很难弄清楚如何执行此操作,因此下一个函数调用将等待前一个函数调用完成后再调用。然后完成所有“each”迭代以调用返回 例如: getInfo(); function getInfo(){ var return_arr = Array(); var ids = getListOfIDs(); // loop through each id getting more info fro

使用NodeJS,我试图从数据库中获取ID列表上的信息,并填充一个对象数组。我需要同步处理这个。我很难弄清楚如何执行此操作,因此下一个函数调用将等待前一个函数调用完成后再调用。然后完成所有“each”迭代以调用返回

例如:

getInfo();

function getInfo(){
   var return_arr = Array();
   var ids = getListOfIDs();
   // loop through each id getting more info from db
   $.each( ids, function( i, v ){
       return_arr.push(getFullInfo( id ));
   });
   return return_arr;
}

function getListOfIDs(){
  // database call to get IDs
  // returns array
}

function getFullInfo(){
  // database call to get full info
  // returns object
}

这是一个简化的示例,因此假设获取所有信息的单个查询将不起作用,因为有多个连接正在进行,并且需要在js中进行后期处理。另外,假设我正在进行正确的错误处理,我在示例中忽略了这一点

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

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);
  });
}
承诺这样做的方式:

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

您当前的代码示例是同步的,尽管我不知道您的db代码是如何工作的。每个循环都是同步的,它只是在ID上迭代并调用getFullInfo函数

但我不确定为什么需要同步代码,因为它没有使用节点事件循环体系结构


我要做的是使用一个好的Promises框架,比如Bluebird()和Promise.each,确保每次迭代都是连续进行的。或者您也可以使用回调库,例如async()和async.eachSeries。这两种方法都可以确保您(a)获得异步的好处,以及(b)以串行方式进行迭代。

回调不会确保同步处理调用。你能提供一个带有承诺的代码示例吗?回调确保了我理解的调用是同步处理的。你只需要调用前面的代码和后面的代码。当然,promise代码更干净,没有多层次的嵌入。但回调在解决同步问题时应该没有问题。@user6041966回调和承诺的工作方式相同;两者都是异步的。两者都会等待长时间运行的操作完成,然后再调用处理程序函数。这两种武器在行动结束时都能开火。既不是同步的,也不是您的数据库查询代码。为什么我会获得否决票?老实说,我认为这不值得否决票(我个人讨厌没有评论的否决票),但可能是因为解决/拒绝处理缺乏条件?也许这就是问题所在。我将添加它。不一致的代码格式,缺乏解释什么是错误的以及为什么需要进行此更改,etc@KevinB谢谢你的评论。作者只询问异步处理的示例。我浏览了Soviut的帖子,并发布了这个答案。这就是为什么它缺乏解释。我应该提一下。