首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JavaScript -等待所有array.push()完成后再返回函数

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

Stack Overflow用户
提问于 2018-07-02 04:37:21
回答 1查看 5.7K关注 0票数 1

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

My Code (我没有包含定义db的代码,但这并不重要,因为从数据库获取信息工作得很好。)

代码语言:javascript
复制
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);
});
EN

回答 1

Stack Overflow用户

发布于 2018-07-02 04:43:16

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

尝试如下所示:

代码语言:javascript
复制
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函数来使代码更扁平化:

代码语言:javascript
复制
const getChild = async (uid) => {
  const doc = await db.collection("users").doc(uid).get();
  const { students } = doc.data();
  return Promise.all(students.map(async (student) => {
    const res = await db.collection("students").doc(student).get();
    return res.data();
  )));
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51126839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档