我编写了一个循环对象的函数,并使用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);
});
答案 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