JavaScript-等待所有array.push()完成后再返回函数

时间:2018-07-01 20:37:21

标签: javascript arrays object

我编写了一个循环对象的函数,并使用array.push(XYZ)将值(XYZ)附加到数组(array)。循环完成后,函数将返回promise。使用myFunction().then(function(response) { console.log(response[0])})时,我在控制台中得到undefined。在控制台中输入console.log(response[0])时,将获得正确的值。我究竟做错了什么?我认为将值推入数组需要花费时间,但我不是100%。任何帮助将不胜感激。

我的代码 (我没有提供定义db的代码,但是从数据库中获取信息的工作正常,这并不重要。) < / p>

function getChild(uid) {
    promise = db.collection("users").doc(uid).get().then(function(doc) {
      output = [];
      val = doc.data();
      studentsObj = val.students;
      studentsObj.forEach(function(student) {
        db.collection("students").doc(student).get().then(function(res) {
          varl = res.data()
          output.push(varl);
        });
      });
      return output;
    });
    return promise;
};

getChild("parentUserID").then(function(reply) {
  got = reply;
  console.log(got);
});

1 个答案:

答案 0 :(得分:1)

forEach内部的异步操作不会与外部Promise链链接在一起-使用map来创建Promises的数组,然后您需要返回{{ 1}},以便正确地链接每个Promise.all生成的承诺。您还应该尝试避免隐式创建全局变量-改为使用studentsObj

尝试这样的事情:

const

或者,使用const getChild = (uid) => ( db.collection("users").doc(uid).get() .then(doc => { const { students } = doc.data(); return Promise.all(students.map(student => ( db.collection("students").doc(student).get() .then((res) => res.data()) ))) }) ); 函数来使代码更扁平:

async