我想知道如何通过值而不是引用将数据传递到jQuery then
对象的Deferred
处理程序中。
我有以下示例代码来说明我的问题:
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,希望有人可以提供帮助吗?
答案 0 :(得分:2)
是..你必须在它周围创建一个闭包
for (var i = 0; i < data.length; i++) {
value = data[i];
deferred.then( function(val) {
return function(response) {
console.log(response+':'+val);
}}(value));
}
答案 1 :(得分:1)
试试这个:
<com.viewpagerindicator.CirclePageIndicator
android:id="@+id/indicator"
style="@style/CustomCirclePageIndicator"
android:layout_height="wrap_content"
android:padding="5dp"
android:layout_width="fill_parent"
android:layout_alignParentBottom="true"
android:layout_marginBottom="20dp"/>
答案 2 :(得分:0)
似乎最简单的解决方案是将for
循环移动到promise回调中。
deferred.then(function(response) {
for (var i = 0; i < data.length; i++) {
value = data[i];
console.log(response+':'+value);
}
});
如果你需要在你的promise处理之外使用循环,我会考虑不在循环中定义函数并使用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));
}