【问题标题】:Populating request promise uri with for loop index使用 for 循环索引填充请求承诺 uri
【发布时间】:2023-03-08 08:15:01
【问题描述】:

我有一系列请求,我想在 for 循环中调用。

我在端点中唯一改变的是索引参数。这个索引参数应该和for-loop(0-100)的索引一样。

但是,承诺返回值都是来自端点之一的相同响应。 (即所有的返回值都是我对 ${someEndPoint}?index=61 的期望)。

someIndex = 100
var promises = [];

for (var i = 0; i < someIndex; i++){
    var options = {
        method: 'GET',
        uri: `${someEndPoint}?index=${i}`,
        json: true
    }
    promises.push(request(options))
}
Promise.all(promises).then(function(values){
    console.log(values) // returns array of 100 of the same responses.
}).catch(e => {
    console.log(e)
});

附:我正在使用 node.js 服务器,它显示我的服务器已进行了所有 100 次正确的 GET 调用,但值对象仅多次填充了一个特定的请求响应。

[{ index: 70, data: '...' },
{ index: 70, data: '...' },
...
{ index: 70, data: '...' },
{ index: 70, data: '...'} ]

我想怎样才能得到正确的回答?

【问题讨论】:

  • 您发布的代码不应该有这个问题,所以如果这是导致您的问题的代码,那么它可能是 request 方法做错了。您可以使用 map Promise.all([...new Array(100)].map((_,i)=&gt;i).map(i=&gt;request(...i)).then(result=&gt;...) 来简化代码
  • 我刚刚检查了我调用的端点有问题(我也写过)。如果其他人遇到同样的问题,那是因为我在代码中错过了var,这使得一些变量成为全局变量。在github上发现了一个类似的问题:github.com/request/request-promise/issues/212.

标签: javascript node.js promise request request-promise


【解决方案1】:

您应该在此循环中使用异步等待。您还应该探索闭包和其他概念。

您会得到相同的索引响应,因为您不需要等待每个响应。

探索异步等待。

一些链接:

Using async/await with a forEach loop

https://dev.to/kayis/await-your-loops-680

https://medium.com/@antonioval/making-array-iteration-easy-when-using-async-await-6315c3225838

【讨论】:

  • 不,使用 await 将使请求在 serie,而不是并行。问题中的代码也没有任何问题(除了使用循环过度复杂化)
猜你喜欢
  • 1970-01-01
  • 2018-08-04
  • 2023-03-16
  • 2015-12-18
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多