制作具有连续参数请求的动态数
我建立在我需要开始一个指定的号码按顺序编号的请求的应用程序。这是我第一次的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: '=' + 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
我知道为什么发生这种情况是因为请求承诺是如何工作的,但我不知道如何解决它。
回答如下:您apiRequest(object
)的结果{ id: id, html: data };
将异步创建的承诺得到解决之后。在那一刻id
变量分配给它的最新值。因此,所有已创建的结果对象将具有相同的价值。
为了解决这个问题,你应该保持在每for
步骤您的ID的参考。所以定义它使生成的ID的array
和每个ID推到它,因为它有相同的顺序apiRequests
,然后你可以通过results
的索引来访问他们。
var apiRequests = [];
var ids = [];
// ...
apiRequests.push(/* ... */);
ids.push(id);
// ...
console.log(ids[i]);
该替代的解决方案将使用let
代替var
如果可能的话。以及描述here:
var
的作用范围是最接近的功能块,并让可以被限制在最近的封闭块。
如果定义里面let
一个for
变量,一个唯一的实例会在每一步创建和它在你的对象的引用也将被保留,直到退出功能范围。所以实现起来是这样的:
for (var i = 0; i < numIterations; i++) {
let finalId = id; // add this line
var requestDetails = {
uri: 'https://www.example/id=' + id,
json: false
};
apiRequests.push(
rp(requestDetails).then(
function (data) {
return {
id: finalId, // update this line
html: data
};
}
)
);
id++;
}
至于建议尝试use let
and const
instead of var