如何按值将数据传递到延迟然后处理程序



我想知道如何通过值而不是引用将数据传递到jQueryDeferred对象上的then处理程序中。

我有以下示例代码来说明我的问题:

var value;
var deferred = new $.Deferred();
var data = ["A", "B", "C", "D"];
// add a separate call to the chain for each piece of data
for (var i = 0; i < data.length; i++) {
value = data[i];
deferred.then(function(response) {
console.log(response+':'+value);
});
}
deferred.resolve("test");

我想要得到的结果:

test:A
test:B
test:C
test:D

我实际得到的结果是:

test:D
test:D
test:D
test:D

value的值似乎是在执行then处理程序时评估的,而我希望它在then处理程序排队时评估。

我有一把JSfiddle,希望有人能帮忙吗?

是。。你必须围绕它创建一个闭包

for (var i = 0; i < data.length; i++) {
value = data[i];
deferred.then( function(val) {
return function(response) {
console.log(response+':'+val);
}}(value));
}

试试这个:

var value;
var data = ["A", "B", "C", "D"];
// add a separate call to the chain for each piece of data
for (var i = 0; i < data.length; i++) {
value = data[i];
$.when($.Deferred().resolve("test"), $.Deferred().resolve(value))
.then(function(response, x) {
console.log(response + ':' + x);
});
}

Js报价

似乎最简单的解决方案是将for循环移动到promise回调中。

deferred.then(function(response) {
for (var i = 0; i < data.length; i++) {
value = data[i];
console.log(response+':'+value);
}
});

如果你需要在承诺处理之外有一个循环,我会考虑不在循环中定义函数,而是使用一个curried函数:

function processResponse(val){
return function(response){
console.log(response,':',val);
}
}
for (var i = 0; i < data.length; i++) {
value = data[i];
deferred.then(processResponse(value));
}

相关内容

最新更新