Я пытаюсь вернуть клиенту объект master / 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"
Как правильно это делать? Я стараюсь не использовать асин
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.info(e);
}
for (i = 0; i < master.length; i++) {
modelsDetail.getDetails(objModels.hdb, master[i].nrMaster, (e, detail) => {
if (e) {
return console.info(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 для второго цикла, но безуспешно.
Повторяю рекомендацию обещаний @ schu34. Promise.all здесь отлично подходит.





Для этого вам следует использовать обещания. Вот пример, который должен решить вашу проблему:
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.info(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.info(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.all(), чтобы дождаться разрешения всех обещаний, прежде чем отправлять результат в ответ.
Большое спасибо, сэр @Hammerbot, отлично поработали!
В то время я не замечал, но теперь я получаю одну и ту же деталь для всех мастеров, есть идеи, почему и как это исправить? Я попытался очистить список и переместить мастер master[i].DetailList = list, но безуспешно.
Если вы используете обратные вызовы, использование
async.forEach, вероятно, будет правильным решением. Ваш код, вероятно, будет намного проще, если использовать обещания.