节点API-来自第二个循环的res.send()



我正试图将hole master/detail对象返回到客户端,但detail是一个空数组就像这篇文章一样,我也遇到了同样的问题:

"Can't call res.send(data) inside the loop because res.send() can only be called once." "But if I call res.send(array) outside of the loop, the array is still empty"

做这件事的正确方法是什么?我尽量不使用asyn

var getMasterDetail = function (req, res) {
const key = "Detail";
var list = {}
list[key] = []
var modelsMaster = objModels.ObjMaster
var modelsDetail = objModels.objDetail
modelsMaster.getMasters(objModels.hdb, (e, master) => {
if (e) {
return console.log(e);
}              
for (i = 0; i < master.length; i++) {
modelsDetail.getDetails(objModels.hdb, master[i].nrMaster, (e, detail) => {
if (e) {
return console.log(e);
}
for (j = 0; j < detail.length; j++) {
list[key].push(detail[j])
}
})
master[i].DetailList = list           
};
res.send({ MasterDetail: master })
})
};

谢谢。

更新:@Hammerbot的回答几乎是正确的,但是,我当时没有注意到,我得到了所有大师相同的细节。示例{master:{1,2,3,4,5,6}, master{1,2,3,4,5,6}}而不是{master:{1,2,3}, master{4,5,6}}

我不知道为什么以及如何修复它。我试图在循环之前清理列表,并移动master master[I].DetailList,为第二个循环创建第二个Promise,但没有成功。

您应该使用promise。以下是一个应该解决您问题的示例:

var getMasterDetail = function (req, res) {
const key = "Detail";
var list = {}
list[key] = []
var modelsMaster = objModels.ObjMaster
var modelsDetail = objModels.objDetail
modelsMaster.getMasters(objModels.hdb, (e, master) => {
if (e) {
return console.log(e);
}
const promises = []
for (i = 0; i < master.length; i++) {
const promise = new Promise(resolve => {
master[i].DetailList = list
modelsDetail.getDetails(objModels.hdb, master[i].nrMaster, (e, detail) => {
if (e) {
return console.log(e);
}
for (j = 0; j < detail.length; j++) {
list[key].push(detail[j])
}
resolve()
})
})
promises.push(promise)
}
Promise.all(promises).then(() => {
res.send({ MasterDetail: master })
})
})
};

正如您所看到的,在循环之前,我启动了一个promises数组。在循环中,我通过迭代创建了一个promise,该promise在回调完成时得到解决。

我将promise推送到promise数组中,最后我使用Promise.all()等待所有promise得到解决,然后在响应中发送结果。

最新更新