我编写了一个遍历对象的函数,并使用array.push(XYZ)
将值(XYZ
)追加到数组(array
)。循环完成后,该函数返回一个promise。当我使用myFunction().then(function(response) { console.log(response[0])})
时,我在控制台中得到undefined
。当我在控制台中输入console.log(response[0])
时,我得到了正确的值。我做错了什么?我认为将值推入数组需要时间,但我不是100%。任何帮助都将不胜感激。
My Code (我没有包含定义db
的代码,但这并不重要,因为从数据库获取信息工作得很好。)
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);
});
发布于 2018-07-02 04:43:16
forEach
内部的异步操作不会与外部Promise链链接在一起--使用map
创建一个Promises
数组,然后需要返回一个Promise.all
,以便正确链接每个studentsObj
生成的Promise。您还应该尝试避免隐式创建全局变量-使用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
函数来使代码更扁平化:
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();
)));
};
https://stackoverflow.com/questions/51126839
复制相似问题