在数组上循环使用x项数量,我在循环中执行了一个承诺。允诺接受一个依赖于递增值的参数(即。i
的当前值。
我想知道实现此功能的正确/最佳方法是什么,以便确保i
的正确值被解析为承诺。
这是代码结构的一个示例。
for (var i = 0; var < array.length; ++i) {
SomePromise.get(i).then(function(result) {
console.log(result);
}).catch()......
}
正如您所收集的,i
可能/将成为解析到承诺之前增量的最后值。也就是说,在执行承诺之前,循环已经执行到最后,将i的值保留为数组的长度。
发布于 2016-04-05 23:29:03
正如您所收集的,
i
可能/将成为解析到承诺之前增量的最后值。
而不是你使用i
的方式。此代码:
SomePromise.get(i)...
...takes i
的值并将其传递给get
。一旦get
接收到它,该值就不会以任何方式连接到i
变量,所以get
对它做什么并不重要。
如果在this question and its answers回调中使用i
,则您正在考虑的问题(由then
讨论)将发生。但是在使用它的地方,将它作为参数传递到函数中,它不会发生,因为这与闭包无关。同样,关键是i
的值被传递到get
中,而不是对i
变量的某种引用(JavaScript没有任何形式的按引用传递,只有闭包)。
在将正确的i
传递到代码并对结果进行处理方面,该代码很好。
下面是一个演示,说明这样做很好(要求浏览器支持Promise
):
function getSomePromise(value) {
return new Promise(function(resolve) {
resolve(value);
});
}
var array = [1, 2, 3, 4];
for (var i = 0; i < array.length; ++i) {
getSomePromise(i)
.then(function(result) {
var p = document.createElement("p");
p.innerHTML = "Result is " + result;
document.body.appendChild(p);
});
// catch omitted for brevity
}
...and演示了如何在then
回调中使用i
会产生您担心的效果(这取决于代码的目标是好是坏):
function getSomePromise(value) {
return new Promise(function(resolve) {
resolve(value);
});
}
var array = [1, 2, 3, 4];
for (var i = 0; i < array.length; ++i) {
getSomePromise(i)
.then(function(result) {
var p = document.createElement("p");
p.innerHTML = "Result is " + result + ", i is " + i;
document.body.appendChild(p);
});
// catch omitted for brevity
}
如果您需要在i
回调中使用then
,并且想要当时的版本,而不是最终版本,那么在这个特定的情况下,您可能会使用array.forEach(function(entry, index) ...)
,然后使用index
,这不会改变:
function getSomePromise(value) {
return new Promise(function(resolve) {
resolve(value);
});
}
var array = [1, 2, 3, 4];
array.forEach(function(entry, index) {
getSomePromise(index)
.then(function(result) {
var p = document.createElement("p");
p.innerHTML = "Result is " + result + ", index is " + index;
document.body.appendChild(p);
});
// catch omitted for brevity
});
但你的问题有点离谱了。
发布于 2016-04-05 23:37:38
如果使用for循环不是必须的,您也可以考虑使用Array.prototype.forEach
。
array.forEach(function(arrayItem, i){
SomePromise.get(i).then(function(result) {
console.log(result);
}).catch()......
});
在functional JavaScript领域,这个功能非常适合于承诺等待:
Promise.all(array.map(function(arrayItem, i){
return SomePromise.get(i).then(function(result) {
console.log(result);
}).catch()......
}));
无论是for-循环还是forEach/map,整数i
都将按值传递到函数中,因此不会影响循环中的增量。
https://stackoverflow.com/questions/36444247
复制相似问题