如何通过值将数据传递到延迟的处理程序?

时间:2015-04-24 17:27:57

标签: javascript jquery ajax deferred pass-by-value

我想知道如何通过值而不是引用将数据传递到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,希望有人可以提供帮助吗?

3 个答案:

答案 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"/>

JsFiddle

答案 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));
}