2016-05-18 2 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... 
     } 
    }); 
} 

問題は、私は、URLを取得するために待機することなく、上記のループのすべてのインスタンスですぐにヒットされていることフィドラーで見ていますmySpecialFunction()内のajaxコードからの応答。もちろん、これは私が得なければならない結果を混乱させます。

+0

'.then(customIteration(arr、i))'を '.then(function(){customIteration(arr、i)})に変更します。 – A1rPun

+1

@ A1rPunこれは実際に働いた!どうもありがとうございます。 – user2413079

答えて

0

の.done、実際にはの.done()

を使用してみてください)が唯一の成功コールバックを持っています。

.then()には、成功と失敗の両方のコールバックがあります。

jfer1.8以降、deferred.then()メソッドは、関数によって遅延された状態と値をフィルタリングし、now-deprecated deferred.pipe()メソッドを置き換える新しい約束を返します。

deferred.done()メソッドは、1つまたは複数の引数を受け取ります。これらの引数はすべて、単一の関数または関数の配列のいずれかになります。

deferred.done()は遅延オブジェクトを返します。追加の.done()メソッドを含め、遅延オブジェクトの他のメソッドをこのオブジェクトにチェーンすることができます。 Deferredが解決されると、resolveまたはresolveWithメソッド呼び出しに提供された引数を追加された順に使用して、doneCallbackが実行されます。

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 

は確かにあなたの単一の反復は再び自分自身を呼び出し、反復を続行する前に終了しますです。 基本的に、関数は1回の繰り返しで終了した時点で自分自身を呼び出し、すべてが反復されてから停止するまで続けます。

関連する問題