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

时间:2018-11-16 15:22:26

标签: node.js api

我正在尝试将孔主对象/详细对象返回给客户端,但是细节以空数组的形式出现 像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,但没有成功。

1 个答案:

答案 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解析,然后再将结果发送到响应中。