Javascript 节点js将变量传递到请求回调函数中
我希望将一个变量绑定到我的请求对象,以便在进行回调时可以访问该变量 这是图书馆: 这是我的密码Javascript 节点js将变量传递到请求回调函数中,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我希望将一个变量绑定到我的请求对象,以便在进行回调时可以访问该变量 这是图书馆: 这是我的密码 var request = require('request'); for (i = 0; i < cars.length; i++) { request({ headers: { 'Content-Type': 'application/json'}, uri: 'https://example.com', method: 'POST',
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);
});
}
var request=require('request');
对于(i=0;i
您已经可以访问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);
}
var request=require('request');
对于(i=0;i
原始代码的问题是,异步函数发生在i
值更改很久之后,在这种情况下,每次调用异步函数时,它将等于cars.length
通过使用自调用函数,我们只传入应用于函数中所有内容的
i
值。正文是字符串吗?您是否尝试过JSON.stringify({“clientId”:“x”,“clientSecret”:“y”})
您需要为每个索引使用一个单独的作用域。请参阅。^我觉得这是不同的,因为我使用的是一个请求对象。这与函数是异步的这一事实无关。@如果在他的代码中同步调用匿名函数,它将以i
的预期值执行,不是吗?(是的)。如果没有异步调用,它将在<代码>的中间被调用为循环,期望的<代码> i>代码>值。因为它是异步的,所以它本质上只能在事件循环的下一次迭代中最快发生。在这种情况下,它只能在for
循环完成运行后发生。(假定异步性不是这里唯一影响的概念,但它是原因的核心部分。)如果您使用超时而不是异步函数,您将看到每个console.log都有相同的值,5。@loan timeout是一个异步函数……这可能归结为语义。出于讨论的目的,我要说的是,异步函数是一种函数调用,在事件循环的一个特定迭代期间,在应用程序的同步流中不会调用它。setTimeout将在事件循环的当前迭代之后调用,即使它设置为0。在本讨论中,这是一个非常广泛但准确的异步定义。关键是事件循环:)