【问题标题】:Node API - res.send() from 2nd loop节点 API - 来自第二个循环的 res.send()
【发布时间】:2018-11-25 23:03:50
【问题描述】:

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

正确的做法是什么? 我试图不使用 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,但没有成功。

【问题讨论】:

  • 如果您使用回调,使用async.forEach 可能是正确的方法。如果使用 Promise,你的代码可能会简单得多。
  • 支持@schu34 对 Promises 的推荐。 Promise.all 似乎非常适合这里。

标签: node.js api


【解决方案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 得到解决,然后在响应中发送结果。

【讨论】:

  • 非常感谢@Hammerbot 先生,工作就像一个魅力!
  • 我当时没有注意到,但现在我得到了所有大师的相同细节,知道为什么以及如何解决它吗?我试图清理列表并移动主人master[i].DetailList = list没有成功。
猜你喜欢
  • 2014-05-25
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 2016-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多