gpt4 book ai didi

javascript - 循环中带有附加参数的回调

转载 作者:太空宇宙 更新时间:2023-11-04 03:24:08 25 4
gpt4 key购买 nike

我正在编写 Node.JS lambda 函数,我需要在其中调用一些带有回调的 API 函数并向那里传递附加参数。

代码如下:

var s3 = ...;
for (var i = 0; i < data.foo.length; i++) {
var v1 = data.foo[i].name;
console.log("Loop: " + v1);
var params = { ... };
foo.method1(params, function(err, data1) {
console.log("Method1: " + v1);
s3.putObject(....);
});
}

这里有两个问题。

  1. 我不明白为什么,但是在回调内部传递给foo.method1...我始终具有相同的值 v1 (我猜这是数组中的最后一个)。

  2. Amazon 控制台的代码检查器建议我在循环内创建函数是一种不好的做法:

Don't make functions within a loop.

我猜,p.1 在某种程度上与 p.2 相关:-) 这就是为什么我尝试创建一个命名函数并将其引用传递给 foo.method1 。但它不起作用,因为我无法传递附加参数 v1s3那里。我只能像这样包装它的调用:

    foo.method1(params, function(err, data1) { 
myCallback(err, data1, v1, s3);
});
  • 这没有意义,因为结果是一样的。

提示:foo.method1显然是异步的。

我不知道如何解决这个问题?

最佳答案

这是一个常见问题,称为“关闭循环变量”。问题是,当您等待回调执行时,v1 将继续更改,并且您看到的 v1 将是它采用的最后一个值。

解决此问题的一种方法:在回调中绑定(bind) v1 变量:

var s3 = ...;
for (var i = 0; i < data.foo.length; i++) {
var v1 = data.foo[i].name;
console.log("Loop: " + v1);
var params = { ... }; // v-- extra parameter
foo.method1(params, function(v1inner, err, data1) {
console.log("Method1: " + v1);
s3.putObject(....);
}.bind(null, v1)); // <-- bind
}

更好的方法:使用 .forEach 以便为每次迭代创建一个新的 v1 变量:

var s3 = ...;
data.foo.forEach(function (datai) {
var v1 = datai.name;
console.log("Loop: " + v1);
var params = { ... };
foo.method1(params, function(err, data1) {
console.log("Method1: " + v1);
s3.putObject(....);
});
});

编辑:如果您正在寻找一种更轻松的方式来使用异步代码,我建议您研究 Promises,到目前为止,Promises 是 JavaScript 中异步代码的 future 。这将使您能够轻松管理异步操作,例如,在所有这些操作完成时执行一些代码(如果您想这样做)。

关于javascript - 循环中带有附加参数的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46831186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com