node.js - 二、nodejs HTTP请求如何一个接一个?
问题描述
我有一堆 HTTP 请求需要一个接一个地发送到 Web 服务。我不想同时运行它们,因为我会因为对服务同时运行这么多查询而遇到麻烦。
我以为我可以使用 await 和 async 函数来做到这一点,但似乎它仍然没有等待一个请求在另一个请求之前完成。如果我在下面运行代码,所有 50 个请求都会以我的计算机发送它们的速度被触发......
我只是使用错误的承诺吗?有一个更好的方法吗?我只是羞于写 CURL 命令:P。
#!/usr/bin/env node
const [, , ...args] = process.argv
const request = require('request');
const fs = require('fs');
function downloadReport(options){
return new Promise((resolve, reject) => {
console.log("Sending request at " + new Date() );
request(options, function(error,response,body){
if (error) reject(error);
console.log("----------------------------------------------------------------------------------------------------");
console.log("options is " + JSON.stringify (options));
console.log("----------------------------------------------------------------------------------------------------");
console.log("Request Complete at " + new Date() );
resolve(body);
});
});
}//END FUNCTION DOWNLOAD REPORT
async function pullReport(options){
console.log("report pull for " + options.i);
try{
var body = await downloadReport(options);
console.log("Writing out " + options.i + " - report.txt\r\n");
console.log("----------------------------------------------------------------------------------------------------");
fs.writeFile(options.i + " - report.txt", body, function(err) {
if(err) {
return console.log(err);
}
});
}catch(ex){
console.error('ERROR:');
console.error(ex);
}
}//END PULLREPORT FUNCTION
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;
const url = "https://www.google.com"
for (var i = 1; i<=50;i++){
var options = {
method: 'GET',
url: url,
i:i
};
console.log("***********************************************************************************************");
pullReport(options);
console.log("***********************************************************************************************");
}//END FOR LOOP
解决方案
看来您只需要await pullReport(options);
在循环中:
(async function main() {
try {
for (var i = 1; i<=50; i++){
var options = {
method: 'GET',
url: url,
i:i
};
console.log("***********************************************************************************************");
await pullReport(options);
console.log("***********************************************************************************************");
}
} catch (err) {
console.error(err);
}
})();
推荐阅读
- firebase - Firebase won't accept SHA1 keys previously used with deleted app
- c++ - thread_local in C++ 11 isn't consistent
- python - 无法在 Python 3.8.8 上安装 PyCurl 7.43.0.6 | RHEL 8.3
- python - 如何通过读取 csv 数据并在 API 有效负载中使用来形成正确的 JSON
- machine-learning - Machine learning model with varying input shape as time changes
- javascript - php mysql重定向脚本甚至会注销经过身份验证的用户
- flutter - 如何在 Flutter Hooks 中使用 didChangeAppLifecycleState
- c# - 路由不适用于 asp.net api 项目
- java - 使用流的地图键的for循环
- ember.js - 如何重新加载 ember-data 与 ember octane 中的 hasMany 关系?