我的代码如下:
myinsts.forEach(function (myinstId) {
Organization.getOrgById(myinstId,function (err,insts)
{
res.json(insts);
})
});
我正在使用Node.js并且我收到了错误"发送后无法设置标头" ,显然我的服务器发送第一次迭代,我怎么能保持它直到我得到整个数据
答案 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);
}
})
});