node.js - 使用顺序参数发出动态数量的请求
问题描述
我正在构建一个应用程序,在该应用程序中我需要从指定的数字开始发出顺序编号的请求。这是我的第一个 node.js 项目,所以我边走边学,但我被困在这个特定的问题上。
我需要传递 id 以便以后可以引用它。本质上,我需要使用第一个请求中的数据向不同的 api 发出第二个请求。对第二个请求发出的大部分数据将来自第一个请求的响应,但 id 不是,所以我需要以某种方式传递它。
const rp = require('request-promise');
var id = process.argv[2];
var numIterations = process.argv[3] || 5;
var apiRequests = [];
for (var i = 0; i < numIterations; i++) {
var requestDetails = {
uri: 'https://www.example.com/id=' + id,
json: false
};
apiRequests.push(
rp(requestDetails).then(
function (data) {
return {
id: id,
html: data
};
}
)
);
id++;
}
Promise.all(apiRequests)
.then((results) => {
for (var i = 0; i < results.length; i++) {
console.log(results[i].id); continue;
}
}).catch(err => console.log(err));
例如,如果 id = 1 和 numIterations = 5,那么我希望看到: 1 2 3 4 5
但相反,我看到: 5 5 5 5 5
我明白为什么会发生这种情况,因为 request-promise 是如何工作的,但我不确定如何最好地解决它。
解决方案
object
您的 apiRequest ( )的结果{ id: id, html: data };
将在 promise 得到解决后异步创建。在那一刻,id
变量具有分配给它的最新值。所以所有创建的结果对象都将具有相同的值。
for
要解决问题,您应该在每个步骤中保留您的 id 参考。因此,定义一个array
它保留生成的 id 并将每个 id 推入其中,并且由于它具有与 相同的顺序,因此apiRequests
您可以通过results
.
var apiRequests = [];
var ids = [];
// ...
apiRequests.push(/* ... */);
ids.push(id);
// ...
console.log(ids[i]);
如果可能,替代解决方案将使用let
而不是var
。正如这里所描述的:
var
作用域为最近的功能块,而 let 的作用域为最近的封闭块。
如果您let
在 内部定义一个变量for
,则将在每个步骤中创建一个唯一实例,并且在您的对象中引用它时,它将一直保留到您退出函数范围。所以实现将是这样的:
for (var i = 0; i < numIterations; i++) {
let finalId = id; // add this line
var requestDetails = {
uri: 'https://www.example.com/id=' + id,
json: false
};
apiRequests.push(
rp(requestDetails).then(
function (data) {
return {
id: finalId, // update this line
html: data
};
}
)
);
id++;
}
作为建议尝试使用let
andconst
而不是 var
推荐阅读
- html - 反向迭代表(vue)
- android - Android:MediaPlayer onPrepared 不工作
- javascript - 在 Vue3 中使用 ChartJs /not vue-chartjs/
- sql - 无法将表格导出为 csv 格式
- css - 当 0 值没有单位时如何验证 CSS
- database - 如何在flutter firebase中获取具有用户ID的谷歌用户对象?
- swift - 如何在 swift 中使用字典解析 json?
- android - Android MediaExtractor:读取 mp3 文件时速度慢
- c++ - 为什么我会收到此错误:CSE 类没有名为 EnterRN 和 EnterName 的成员?
- java - Android Studio 接受许可