Javascript 函数乱序完成——异步

标签 javascript node.js promise async-await google-cloud-firestore

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

相关文章:

javascript - 正则表达式也阻止换行

javascript - Sails.js - 一对多映射

javascript - 使用toggle()时如何正确防止冒泡?

node.js - Heroku 裸 SSL 自定义域

node.js - 关闭空闲连接 : Does Sequelize allow me to view how long a DB connection has been idle?

javascript - 使用 Promise.all(),其中个人 promise 出错时重试

Javascript 对象无法识别为 addEventListener 的 DOM 对象

node.js - nodejs electronjs sqlite3 - 使用未声明的标识符 'napi_is_detached_arraybuffer'

javascript - 将一个 Promise 的返回值作为另一个 Promise 的参数传递

javascript - 为 Promise 结果对象的每个数组元素调用异步函数,进行更改并返回该对象