使用顺序参数动态请求数量

时间:2019-02-03 03:52:48

标签: node.js request-promise

我正在构建一个应用程序,在该应用程序中,我需要发出以指定编号开头的按顺序编号的请求。这是我的第一个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

我明白为什么这种情况是由于请求承诺的工作原理引起的,但是我不确定如何最好地解决它。

1 个答案:

答案 0 :(得分:1)

您的apiRequest(object)的结果{ id: id, html: data };将在承诺得到解决后异步创建。此时id变量已分配了最新值。因此所有已创建的结果对象将具有相同的值。

要解决该问题,您应该在每个for步骤中保留自己的ID引用。因此,定义一个array,使其保留生成的ID,并将每个ID推入其中,并且由于它与apiRequests的顺序相同,因此您可以按{{1 }}。

results

如果可能,替代解决方案将使用var apiRequests = []; var ids = []; // ... apiRequests.push(/* ... */); ids.push(id); // ... console.log(ids[i]); 而不是let。正如here所述:

  

var的作用域为最近的功能块,let的作用域为最近的封闭块。

如果您在var内定义了let变量,则将在每个步骤中创建一个唯一的实例,并且该实例将在对象中被引用,直到退出功能范围为止。因此,实现将如下所示:

for

建议您尝试use let and const instead of var