2016-05-18 43 views
0

我有一個自定義循環,在進入下一次迭代之前需要執行一個函數。這是代碼:jQuery .when()在循環中被忽略

function customIteration(arr, i) 
{ 
    if (i==arr.length) return; 
    var message = arr[i]; 
    jQuery('#stepTwo #num1StepTwo').html('Expires: ' + $num1); 
    jQuery('#stepTwo #num2StepTwo').html(jQuery(message).find('.num2').text()); 
    jQuery('#stepTwo #num3StepTwo').html(jQuery(message).find('.num3').text()); 
    i++; 
    jQuery.when(mySpecialFunction()).then(customIteration(arr, i)); 
} 

mySpecialFunction():

function mySpecialFunction(){ 
    return jQuery.ajax({ 
     url: "https://api.site.com/customurl", 
     dataType: "jsonp", 
     data: { data1: $data1, data2: $data2 }, 
     success: function (data) { 
      ...some code... 
     }, 
     error: function (e) { 
      ...some other code... 
     } 
    }); 
} 

問題是,我在小提琴手看到網址是由上述循環的所有實例馬上打,而無需等待獲得來自mySpecialFunction()中的ajax代碼的響應。這當然會弄亂我應該得到的結果。

+0

將'.then(customIteration(arr,i))'改爲'.then(function(){customIteration(arr,i)})''。 – A1rPun

+1

@ A1rPun這實際上工作!非常感謝。 – user2413079

回答

0

嘗試使用.done()

其實

.done()只有成功回調。

.then()具有成功和失敗回調。

從jQuery 1.8開始,deferred.then()方法返回一個新的promise,它可以通過函數過濾延遲的狀態和值,取代現在不推薦的deferred.pipe()方法。

deferred.done()方法接受一個或多個參數,所有參數都可以是單個函數,也可以是一個函數數組。

由於deferred.done()返回延遲對象,因此可以將延遲對象的其他方法鏈接到該對象,包括其他.done()方法。 Deferred解析完成後,使用提供給resolve或askWith方法調用的參數按已添加的順序執行doneCallbacks。

0

嘗試使用.done()和遞歸函數,應該更易於實現和理解。 像這樣:

(function recursive(arr,i){ 
    jQuery.ajax({ 
    url: "https://api.site.com/customurl", 
    dataType: "jsonp", 
    data: { data1: $data1, data2: $data2 }, 
    success: function (data) { 
     ...some code... 
    }, 
    error: function (e) { 
     ...some other code... 
    } 
}).done(function(data){ 
     var message = arr[i]; 
     jQuery('#stepTwo #num1StepTwo').html('Expires: ' + $num1); 
     jQuery('#stepTwo#num2StepTwo').html(jQuery(message).find('.num2').text()); 
     jQuery('#stepTwo #num3StepTwo').html(jQuery(message).find('.num3').text()); 
     if(i!=arr.length){ 
     recursive(++i); 
     } 
}); /// End done 
})(0); ///End recursive function 

這樣做的是確保你的單次迭代再次調用自身並繼續迭代之前結束。 所以基本上你的函數在完成一次迭代時調用自己,並且一直持續到所有事情都被迭代,然後停止。