javascript - 如何在循环中顺序运行请求?

标签 javascript node.js mongodb express request

这是我想要实现的伪代码。首先,我需要从请求正文中获取 URL 列表,然后将这些 URL 传递给请求函数(使用请求模块),该函数将从每个 url 获取数据,然后将这些数据保存到 MongoDB。当所有请求完成(包括将数据保存到服务器)后,它才应该发送响应。

app.post('/', (req, resp) => {

    const { urls } = req.body;

    urls.forEach((url, i) => {

        request(url, function (err, resp, body) {

            if (err) {
                console.log('Error: ', err)
            } else {
                // function to save data to MongoDB server
               saveUrlData(body);
               console.log(`Data saved for URL number - ${i+1}`)
            }
        })
    });

    // Should be called after all data saved from for loop
    resp.send('All data saved')
})

我已经尝试过这段代码,当然 resp.send() 函数将运行而不关心请求是否已完成。使用此代码我在控制台上得到如下结果:

Data saved for URL number - 3
Data saved for URL number - 1
Data saved for URL number - 5
Data saved for URL number - 2
Data saved for URL number - 4

我可以以嵌套形式编写它们,但是变量urls可以有任意数量的url,这就是为什么它需要在循环中,至少根据我的理解。我希望请求按顺序运行,即它应该解析第一个网址,然后解析第二个网址,依此类推,只有当所有网址都完成后,它才应该响应。请帮忙!

最佳答案

app.post('/', async (req, resp) => {

    const {
        urls
    } = req.body;

    for (const url of urls) {
        try {
            const result = await doRequest(url)
            console.log(result)

        } catch (error) {
            // do error processing here 
            console.log('Error: ', err)
        }
    }
})

function doRequest(url) {
    return new Promise((resolve, reject) => {
        request(url, function(err, resp, body) {
            err ? reject(err) ? resolve(body)
        })    
    })    
}

using async await

关于javascript - 如何在循环中顺序运行请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53718460/

相关文章:

node.js - Npm 安装在 Windows 10 上不起作用

mysql - Sailsjs Mysql ORM 对同一个表字段进行多次查询

javascript - 传递嵌套文档查询字段

javascript - 根据字段数组大小分组并删除文档

ruby-on-rails-3 - mongo 的 SEO 友好 url

javascript - 无法使用 xpath、.select 或使用 Python 的 Selenium 单击 "next"按钮

javascript - 使正则表达式超时以避免灾难性的回溯

javascript - 如何更新输入类型=范围的值

javascript - 使用react datepicker,需要为今天的日期和选择的日期应用不同的样式

javascript - 除了 V8 之外,是否有任何带有 JavaScript 引擎的 node.js 平台的端口或替代实现?