我有一个简单的函数,可以调用 firestore 集合并返回公司列表。我遍历列表并输出公司名称。一旦完成,我想写“完成”。
function getCompanies() {
firestore.collection('companies')
.listDocuments()
.then(companies => {
for(var i in companies) {
companies[i].get().then(company => {
console.log(company.name);
});
}
}).catch(err => {
console.error(err);
});
};
getCompanies();
console.log('done');
事实上,这就是发生的事情......
done
ford
gm
toyota
jeep
vw
我研究过 promise ...
function getCompanies() {
firestore.collection('companies')
.listDocuments()
.then(companies => {
let promises = [];
for(var i in companies) {
companies[i].get().then(company => {
promises.push(doIt(company.id));
});
}
Promise.all(promises)
.then((results) => {
console.log("All done", results);
})
.catch((e) => {
// Handle errors here
});
}).catch(err => {
console.error(err);
});
};
function doIt(value) {
return new Promise((resolve) => {
setTimeout(() => {
console.log(value);
resolve(value);
}, Math.floor(Math.random() * 1000));
});
}
getCompanies();
但这也不起作用......
All done []
ford
gm
toyota
jeep
vw
有什么指示或建议吗?我觉得我忘了做一些明显的事情:/.
提前致谢!
最佳答案
这是因为 console.log
是同步的,而 getCompanies() 是异步的。 getCompanies 将在未来解决。稍微阅读一下 Promise 和 async/await。
不使用 async/await 的快速修复将是:
function getCompanies() {
return firestore.collection('companies')
.listDocuments()
.then(companies => {
const promises = [];
for(var i in companies) {
promises.push(companies[i].get());
}
return Promise.all(promises);
}).catch(err => {
console.error(err);
});
};
现在要按顺序运行getCompanies
和console.log
,您需要在getCompanies解析后执行console.log
getCompanies()
.then((companiesarr)=>{
companiesarr.forEach((c)=>{
console.log(c.name)
})
}).then(()=>console.log('done'))
关于Javascript 函数乱序完成——异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59694544/