Node.js将变量传递给请求回调函数

3
我希望将一个变量绑定到我的请求对象中,这样当回调被执行时,我就可以访问这个变量。
这是相关的库: https://github.com/request/request 这是我的代码。
var request = require('request');    
for (i = 0; i < cars.length; i++) { 


  request({
      headers: { 'Content-Type': 'application/json'},
      uri: 'https://example.com',
      method: 'POST',
      body: '{"clientId": "x", "clientSecret": "y"}'
    },
    function(err, res, body){
      // I want to put the correct i here.
      // This outputs cars.length almost everytime.
      console.log(i);
  });

}

字符串类型的吗?你尝试过 JSON.stringify({"clientId": "x", "clientSecret": "y"}) 吗? - mugabits
你需要使用IIFE为每个索引创建一个独立的作用域。 - Ioan
请查看以下网址:https://dev59.com/v3RB5IYBdhLWcg3wAjNH。 - Ioan
我觉得这个不同,因为我正在使用一个请求对象。 - Jimmy Scray
1个回答

9

使用闭包,您已经可以轻松获取到可供使用的 i

var request = require('request');    
for (i = 0; i < cars.length; i++) { 

  (function(i){
    request({
        headers: { 'Content-Type': 'application/json'},
        uri: 'https://example.com',
        method: 'POST',
        body: '{"clientId": "myea1r4f7xfcztkrb389za1w", "clientSecret": "f0aQSbi6lfyH7d6EIuePmQBg"}'
      },
      function(err, res, body){
        // I want to put the correct i here.
        // This outputs cars.length almost everytime.
        console.log(i);
    });
  })(i);
}

您原始代码的问题在于,异步函数发生的时间比i值更晚,此时每次调用异步函数它将等于cars.length

通过使用自调用函数,我们只传入应在函数内部使用的i值。


这与函数是异步的事实无关。 - Ioan
如果匿名函数在代码中同步调用,它将使用预期的i值执行,对吗?(是的)https://jsfiddle.net/fv9aosxe/1/。如果它不是异步调用,它将在`for`循环的中间被调用,并具有预期的`i`值。由于它是异步的,因此它本质上只能在事件循环的下一次迭代中发生,最快也要等到`for`循环完成运行后才会发生。(尽管异步性并不是唯一影响这里的概念,但它是原因的核心部分。) - aaronofleonard
如果您使用超时而不是异步函数,您会发现每个console.log都具有相同的值,为5。 - Ioan
1
@loan timeout是一个异步函数...也许这只是语义问题。为了讨论的目的,我认为异步函数是指在事件循环的一个特定迭代中不在应用程序的同步流程中调用的函数调用。即使设置为0,setTimeout本质上也会在当前事件循环迭代之后被调用。对于本次讨论来说,这是一个非常广泛但准确的异步定义。关键在于事件循环 :) - aaronofleonard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接