这是一个最简单的功能:
module.exports = function Dummy(id) {
this.id = id;
this.delay = function() {
return new Promise(function (resolve, reject) {
// Do some stuff async
// once done
resolve();
});
}
}
我想在for循环中实例化这个Dummy()
类的几个实例:
for (var i = 0; i < 3; i++) {
var id = "id_" + i;
var dummy = new Dummy(id);
dummy
.delay()
.then(function () {
console.log(dummy.id);
});
}
但是,所有这些都打印id_2
;就好像即时dummy
被覆盖一样,即使我每次都在var dummy
循环内实例化变量for
。
非常感谢帮助。
答案 0 :(得分:3)
then function 中有一个名为 dummy 的变量存在闭包问题。该值将是最后一次迭代,因为for的每次迭代都将覆盖前一次迭代。这意味着当 then函数 异步执行时(由于您使用的承诺), dummy var的值将是最后一个循环期间分配的值。
为了解决这个问题,我建议改为:
for (var i = 0; i < 3; i++) {
(function (id) { //Creates a simple new scope
var dummy = new Dummy(id);
dummy
.delay()
.then(function () {
console.log(dummy.id);
});
})("id_" + i);
}
有很多方法可以解决这个问题,但我认为这对您当前的代码来说是最简单的。
您可能已经注意到,对于每次迭代,我都创建了一个新范围。当执行 then function 时,它将访问该范围内的 dummy var。
答案 1 :(得分:0)
这是因为当console.log
发生时,虚拟是id_2
。
.then(function () {
console.log(dummy.id);
});
承诺将在执行for循环后排队并解决。一旦promise解析dummy
是最后一次迭代的值。