多个异步操作完成后退出进程

时间:2018-08-22 18:22:21

标签: javascript node.js

我想在所有数据都将被处理时退出节点进程(获取数据,带有axios的http请求和更新数据)。当我通过输入node script.js运行脚本时,它永远不会结束。我应该在脚本的哪里使用process.exit()来确保已处理所有数据?以下脚本:

Keyword.find({
        images: {
            $eq: []
        }
    })
    .limit(8)
    .exec((err, keywords) => {
        keywords.forEach((keyword) => {
            console.log(keyword.body);
            axios.get('https://www.example.com/?q=' + encodeURIComponent(keyword.body))
                .then(function (response) {
                    const dom = new JSDOM(response.data);
                    let items = dom.window.document.querySelectorAll('div.item');
                    let images = [];
                    items.forEach(((item) => {
                        let url = item.querySelector('a.thumb').href;
                        let source = item.querySelector('a.tit').href;
                        let description = item.querySelector('div.des').innerHTML;
                        images.push({
                            url,
                            source,
                            description
                        });
                    }));

                    Keyword.findByIdAndUpdate({
                        _id: keyword._id
                    }, {
                        $set: {
                            images
                        }
                    }, (err2, result2) => {
                        if (err2) console.log(err2);
                        console.log(result2);
                    });
                })
                .catch(function (error) {
                    console.log(error);
                });
        });
    });

2 个答案:

答案 0 :(得分:1)

从文档中

process.exit()方法指示Node.js以代码的退出状态同步终止进程。如果省略代码,则退出将使用“成功”代码0或process.exitCode的值(如果已设置)。在调用所有“退出”事件侦听器之前,Node.js不会终止。

要以“失败”代码退出:

process.exit(1);

答案 1 :(得分:0)

似乎您的数据库连接使您的应用程序无法自动退出。 因此,您应该在完成工作后关闭数据库连接或致电process.exit()

您正在同时执行多个异步操作

keywords.forEach((keyword) => {
    axios.get(...

要在所有操作完成时收到通知,您可以创建一个Promise数组,并通过Promise.all()方法来监听它们

const operations = keywords.map((keyword) => axios.get('').then((response) => {
    ...
    return new Promise((resolve, reject) => {
        Keyword.findByIdAndUpdate(query, update, (err2, result2) => {
            if (err2) {
                console.log(err2);
                reject(err2);
            }
            console.log(result2);
            resolve();
        });
    });
}));

Promise.all(operations).then(()=>{
    console.log('All done.');
    process.exit();
});