最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

制作具有连续参数请求的动态数

运维笔记admin9浏览0评论

制作具有连续参数请求的动态数

制作具有连续参数请求的动态数

我建立在我需要开始一个指定的号码按顺序编号的请求的应用程序。这是我第一次的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

发布评论

评论列表(0)

  1. 暂无评论