jsP*_*yer 5 javascript asynchronous node.js axios
我有点像 node js 的新手,这就是我想要做的:我正在通过 map 函数(大约 3000 个链接)循环浏览一个充满我们网站链接的 json 文件,在循环内我正在做一个 axios获取每个链接并获取响应状态代码(将来会做其他事情)。但我只想每 2 秒或 5 秒运行一次 axios get,否则我会让网络服务器不堪重负。我正在尝试输入 async await 但它仍然太快并且服务器受到了打击(我在技术上正在 DDos-ing 我自己的网站)。我在 axios 周围放置了一个 SetTimeout 但这似乎不起作用,因为在控制台中结果打印得太快了。所以问题是,我如何让每个 axios.get 请求在地图循环中运行之前每 2 秒等待一次?
var axios = require('axios');
const fs = require('fs');
var statusCheck = 0;
var main = [];
let rawdata = fs.readFileSync('C:/Users/jay/Documents/crawl/filtered2.json');
let jsonParsed = JSON.parse(rawdata);
jsonParsed.map(async(line) => {
var encodeLink = encodeURI(line.link);
const response = await axios.get(encodeLink).catch((err) => {
var Status_ErrorsCatchaxios = {
"status Code": err.response.status ? err.response.status : "No status code available",
"Page title:": $('title').text() ? $('title').text() : 'No title avaialble',
"Original Link": encodeLink ? encodeLink : "No Original Link Available",
"errorCode": err
}
main.push(Status_ErrorsCatchaxios)
})
try {
console.log(response.status)
statusCheck = statusCheck + 1;
console.log("Link: ", statusCheck)
} catch (error) {
console.log(error)
}
})
Run Code Online (Sandbox Code Playgroud)
该[].map
函数不会等待您的项目解析,因此您的代码当前正在并行分派所有请求(如您所说,大约 3000 个)。
您可以使用for...of
它来一次仅运行一个请求。例如:
async function makeRequests (lines) {
for (const line of lines) {
const encodedLink = encodeURI(line.link)
const response = await axios.get(encodedLink)
// ...your response handling code here...
}
}
makeRequests(jsonParsed)
Run Code Online (Sandbox Code Playgroud)
如果你想在每个请求之间等待 2 秒,你可以在循环中添加这行代码for...of
:
await new Promise(resolve => setTimeout(resolve, 2000))
Run Code Online (Sandbox Code Playgroud)
上面的解决方案有效,但我假设您的网络服务器可能一次可以处理多个请求,因此理想的情况可能是限制您的代码在给定时间仅并行发出最多N 个请求。这样,您就不会淹没您的服务器,而且您可以比一次仅执行一个请求更快地获得结果。
bluebird NPM 模块允许您使用其Promise.map函数来做到这一点。
该函数接收您的项目列表作为第一个参数,一个执行某些操作并返回每个项目的承诺作为第二个参数的函数,以及一个带有描述concurrency
您希望允许并行处理的项目数量的对象。第三个论点。
它的工作原理如下:
const bluebird = require('bluebird')
async function makeRequests (lines) {
await bluebird.map(
lines,
async (line) => {
const encodedLink = encodeURI(line.link)
const response = await axios.get(encodedLink)
// ...your response handling code here...
},
{ concurrency: 3 }
)
}
makeRequests(jsonParsed)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5503 次 |
最近记录: |