【问题标题】:Stuck at javascript promises inside forEach loops卡在 forEach 循环中的 javascript 承诺
【发布时间】:2017-12-27 05:52:49
【问题描述】:

让我们考虑保存各种类型分数的字典,例如 {a:0,b:0,c:0} 我有 3 个 mongo db A、B 和 C 的集合。 表演,

A.find({<key>:<value>})
.then(res=>{
    //gets an array of the response <RES1>
})

现在对于数组中的每个元素,我都在这样做

B.find({_id : <RES1[i].some_id>})
.then(res=>{
    //again a new array of responses <RES2>
})

最后,我得到了需要在集合 C 中更新分数的类型,然后我再次在循环中查询,例如

C.find({_id : RES2[i].some_key})....

我不知道我错在哪里!!!下面嵌入代码

getScoreForEachTypes() {
    User.find({ company: req.params.company })
        .then(users => {
            var responsesOfAllUsersArr = [];
            usersForThisCompany = users;
            users.forEach(user => {
                responsesOfAllUsersArr.push(Response.find({ email: user.email }));
            });
            return Promise.all(responsesOfAllUsersArr);
        })
        .then(responsesOfAllUsersArr => {
            var data = { _E: 0, _M: 0, _A: 0, _Q: 0, _E: 0 };
            responsesOfAllUsersArr.forEach(el => {
                el.forEach(_el => {
                    var j = getQuestionType(_el.questionId);
                    data[j] += _el.responseChoice;
                })
            })
        });
}

function getQuestionType(qid) {
    return Question.findOne({ _id: qid })
        .then(el => {
            return el.quesType;
        })
        .catch(err => {
            console.log("err while fetching type of question", err);
        });
}

【问题讨论】:

  • 你如何使用getScoreForEachTypes()?该函数没有返回值。
  • 是的,这就是我卡住的地方,我需要它的返回值才能进一步使用..我需要返回更新的数据,类似于 { _E: 1, _M: 4, _A: 6 , _Q: 3, _E: 0 }
  • 如果你在 User.find 之前写 return 怎么办? (函数内的第一行)
  • @Zyigh 它将返回一个处于待处理状态的承诺,在日志中类似于Promise { &lt;pending&gt; }
  • 是的,对不起,我一点都不清楚......如果你返回 Promise (User.find) 但在函数调用后写 .then() 怎么办?

标签: javascript arrays node.js mongodb mongoose


【解决方案1】:

终于解决了我的问题。 我只需要维护一个数组。

function a(){
    var data = { PE: 0, RM: 0, BA: 0, AIQ: 0, FE: 0 };
    var responsesAll = [];
    var xyz = [];
    return User.find({ company: req.params.company })
        .then(users => {
            var responsesOfAllUsersArr = [];
            usersForThisCompany = users;
            users.forEach(user => {
            responsesOfAllUsersArr.push(Response.find({ email: user.email 
        }));
        });
    return Promise.all(responsesOfAllUsersArr);
    })
    .then(responsesOfAllUsersArr => {
        responsesOfAllUsersArr.forEach(el => {
            el.forEach(_el => {
                responsesAll.push(_el);
                xyz.push(getQuestionType(_el.questionId))
            })
        })
        return Promise.all(xyz);
    }).then(xyz => {
        for (var i = 0; i < xyz.length; i++) {
            data[xyz[i].quesType] += parseInt(responsesAll[i].responseChoice);
        }
        return data;
    })
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 2014-11-25
    相关资源
    最近更新 更多