javascript - Javascript函数乱序整理——异步
问题描述
我有一个简单的函数,它调用一个 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
我已经研究过承诺...
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'))
推荐阅读
- arrays - 使用C计算字符的函数
- perl - 我的输出数组合并成一个数组
- python - 使用 cv2.resize() 进行图像插值会改变整数位置像素
- java - 这是 AVL 还是红黑树?
- sql - 底部有总计的 SELECT 查询
- ios - 在 Core Data 中添加新实体是否需要 2020 年的新模型版本或迁移
- python - 在套接字库 (Python) 中获取错误的 IP - [从另一个适配器获取信息]
- sql - Oracle SQL:如何从组中查找记录
- reactjs - 在 React Native 中构建导航结构
- azure-data-factory - 如何使 Azure 数据工厂中的投影选项卡的导入架构工作?