如何在nodejs中保存我的响应,直到循环结束

时间:2016-05-26 00:06:11

标签: javascript node.js asynchronous callback

我的代码如下:

myinsts.forEach(function (myinstId) {
Organization.getOrgById(myinstId,function (err,insts)
{
   res.json(insts);
})
});

我正在使用Node.js并且我收到了错误"发送后无法设置标头" ,显然我的服务器发送第一次迭代,我怎么能保持它直到我得到整个数据

3 个答案:

答案 0 :(得分:2)

它不会很漂亮。基本上你可以做的是创建一个变量来保存每次迭代的数据,然后检查它是否是要调用的最后一个回调。如果是,那么你可以输出你的json。尝试以下内容:

var _counter = 0;
var _values = [];

myinsts.forEach(function (myinstId) {
Organization.getOrgById(myinstId,function (err,insts)
{
   _values.push(insts);
   if(++_counter == myinsts.length)
      res.json(_values);
})
});

答案 1 :(得分:1)

您希望将Promises用于此类工作,您可以与Promise.all()并行执行每个异步函数,并按照调用的顺序获取数据。

var promises = [];
myinsts.forEach(function (myinstId) {
  promises.push(new Promise((resolve, reject)=>{
    Organization.getOrgById(myinstId,function (err,insts){
      if(err) return reject(err);
      resolve(insts);
    });
  }));
});
Promise.all(promises)
.then((allInsts)=>{res.json(allInsts)}) // all data fetched in loop order.
.catch((error)=>{console.log(error)});

还要考虑让你的getOrgById处理程序返回一个Promise而不是使用回调。

答案 2 :(得分:-1)

你必须发送一次响应,而不是几次。您的代码每次迭代都会发送响应。如果满足特定条件,则发送一次响应。如下。

myinsts.forEach(function (myinstId, index) {
    Organization.getOrgById(myinstId,function (err,insts){
       if( index == myinsts.length -1 ){
           res.json(insts);
       }
    })
});