首页 > 解决方案 > 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

任何指示或建议?我觉得我忘了做一些明显的事情:/。

提前致谢!

标签: javascriptnode.jspromiseasync-awaitgoogle-cloud-firestore

解决方案


那是因为它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'))

推荐阅读