gpt4 book ai didi

Javascript 函数乱序完成——异步

转载 作者:太空宇宙 更新时间:2023-11-04 03:00:11 25 4
gpt4 key购买 nike

我有一个简单的函数,可以调用 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);
});
};

现在要按顺序运行getCompaniesconsole.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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com