我正在尝试将孔主对象/详细对象返回给客户端,但是细节以空数组的形式出现 像this post一样,我也遇到了同样的问题:
"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"
正确的方法是什么? 我正在尝试不使用use 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,为第二个循环创建第二个Promisse,但没有成功。
答案 0 :(得分:1)
您应该为此使用诺言。这是一个可以解决您的问题的示例:
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解析,然后再将结果发送到响应中。