这是我想要实现的伪代码。首先,我需要从请求正文中获取 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/