2016-07-13 3 views
0

The jQuery doco shows an example where two $.ajax calls are made under the control of a $.when([例]の見出しを下に表示)。細かいですが、私は何をしたいのは(私はコールの準備のために他のものを行う可能性があります)関数内のもの$.ajax呼び出しを定義することですjQuery/.when - 引数を関数にパッケージ化しますか?

$.when($.ajax("/page1.php"), $.ajax("/page2.php")) 
    .then(myFunc, myFailure); 

したがって、このような何か:

$.when(myAjaxCall1(), myAjaxCall2()) 
    .then(goodFetches, badFetches); 

私はこのように見えるの機能であることを試してみました:

var myAjaxCall1 = function() 
{ 
    return $.ajax('https://httpbin.org/get?Z=Y,X,W'); 
}; 
var myAjaxCall2 = function() 
{ 
    return $.ajax('https://httpbin.org/get?A=B,C,D'); 
}; 

私はそれぞれのためのgoodFetchesの引数として3つの要素の配列を入手できますかmyAjaxCall1myAjaxCall2ですが、$.ajaxコールを$.whenに直接入れると、これはドキュメントの上の例に示すように私が受け取るのと同じ情報ではありません。これは、関数でうまく動作します

$.when($.ajax("https://httpbin.org/get?Z=Y,X,W"), 
     $.ajax("https://httpbin.org/get?A=B,C,D")) 
    .then(goodFetches, badFetches); 
+0

私はあなたがそれを行うことができないと考え、$アヤックスに呼び出してからの応答を待っていますサーバーから応答が返される前に 'return'を呼び出している間は戻り値がありません。 –

+0

@FadhlyPermata - '$ .ajax()'が返す関数と同じことを、関数から返すことができます。 – jfriend00

+0

コールバックの名前を 'goodFetches、badFetches'とすると、' $ .when'の意味を正確に理解できないことが示唆されます。それはもっと ''すべてのグッド、anyBad ''のようなものです(そして、どんな約束と同じように、2人のうちの1人だけが呼ばれるでしょう)。 – Bergi

答えて

2

:行動はと同等になるように

にはどうすればいいmyAjaxCall1myAjaxCall2再構築しなければなりません。おそらく結果から適切に引数にアクセスしていないだけです。それぞれ3つの要素、すなわち[data, statusText, jqXHR]を含むサブ配列である一連の引数を取得します。これらの引数は、関数内でajax呼び出しを行っているかどうかにかかわらず、関数が約束を返す限り同じです。ここで

は、jQueryのドキュメントからの例です:

$.when($.ajax("/page1.php"), $.ajax("/page2.php")).done(function(a1, a2) { 
    // a1 and a2 are arguments resolved for the page1 and page2 ajax requests, respectively. 
    // Each argument is an array with the following structure: [ data, statusText, jqXHR ] 
    var data = a1[ 0 ] + a2[ 0 ]; // a1[ 0 ] = "Whip", a2[ 0 ] = " It" 
    if (/Whip It/.test(data)) { 
    alert("We got what we came for!"); 
    } 
}); 

$.ajax()呼び出しが$.when()引数にしたり、関数からの約束を返す場合は、直接であればそれは違いはありません。同じ結果。


だから、あなたがこれを行うことができますし、あなたが戻って.then()ハンドラ内で同じデータを取得します:

var myAjaxCall1 = function() { 
    return $.ajax('https://httpbin.org/get?Z=Y,X,W'); 
}; 

var myAjaxCall2 = function() { 
    return $.ajax('https://httpbin.org/get?A=B,C,D'); 
}; 

$.when(myAjaxCall1(), myAjaxCall2()).then(function(a1, a2) { 
     // a1[0] is data from first ajax call 
     // a2[0] is data from second ajax call 
}); 
関連する問題