2017-05-23 5 views
0

私の問題はthis oneに似ていますが、私はこれらの回答で解決できませんでした。JQueryを使用して、進行する前にAJAX呼び出しとそのコールバックが終了するのを待つ方法はありますか?

要するに、ページロード時に、ajaxコールはドロップダウン選択要素を生成し、そのデフォルト値はいくつかのパラメータに応じて設定されます。

getList('country', null, q, 'category:customer', null); 
newReportSelection.apply($("#report")); 

function getList(field, val, q, fq, default_value) { 
    $.get(... { 
     // call info 
    }, function(result) { 
     // appending the dropdown to DOM 
    }); 
}; 

newReportSelection = function() { 
    // determine and select default option 
} 

私はAjaxのコールバック関数にこの(ページのロードに固有の)newReportSelection()のコードを追加することはできませんのでGETLISTは、さまざまな場所で使用されています
コードは次のようなものになります。
getList()呼び出しの約束をすることは、非同期であるため、Ajax呼び出しを待つことはありません。
Ajaxコールの周りにそれを置くことは、それが送信されるのを待ちますが、コールバック関数は実行されません。
Ajaxの部分は待機しているが、非同期性のためにgetList()が続行されているため、コールバック関数の周りに置くことはどちらもうまくいきません。

Ajax呼び出しで連鎖が約束され、コールバック関数が機能したとしても、それは非常に厄介な回避策であり望ましくないように見えます。
AJAX呼び出しを手動でasync: falseに設定せずに、getList()全体が完了するまでnewReportSelection()呼び出しを待機させる方法はありますか?

ありがとうございます。

+1

ジャストコールnewReportSelection()はDOMに追加するajax done関数内にありますか? – juvian

+0

私が言及したように、getList()関数はいくつかの場所で呼び出され、newReportSelection()部分はこれらのケースのうちの1つにしか適用できないため、できません。 – David

+0

getList関数に新しいパラメータを指定すると、それは結果コールバック内でその関数をトリガして呼び出すコールバックです。それが他の場所で使用されている場合は、result関数内でコールバックを渡したかどうかをチェックし、そうでなければコールバックを実行します。 – quirimmo

答えて

3

リターンからの抽出物:

getList('country', null, q, 'category:customer', null).done(function() { 
    newReportSelection.apply($("#report")); 
}); 
+1

これを書こうとしていた: – juvian

+0

それはトリックをした、ありがとう!私はあまりにも約束をするのに慣れていないし、あなたがそれらを追跡するために、この方法でそれらを渡すことができたことを理解していない。 – David

0
var d1 = $.Deferred(); 
var d2 = $.Deferred(); 
var d3 = $.Deferred(); 

$.when(d1, d2, d3).done(function (v1, v2, v3) { 
    console.log(v1); // v1 is undefined 
    console.log(v2); // v2 is "abc" 
    console.log(v3); // v3 is an array [ 1, 2, 3, 4, 5 ] 
}); 

d1.resolve(); 
d2.resolve("abc"); 
d3.resolve(1, 2, 3, 4, 5); 

$に.get

function getList(field, val, q, fq, default_value) { 
    return $.get(... { 
    // call info 
    }, function(result) { 
    // appending the dropdown to DOM 
    }); 
};  

から延期/約束は、あなたが約束.done()方法であなたのフォローを呼び出すことができますhttps://api.jquery.com/jquery.when/

+0

私が理解しているところから、これは複数の約束事を並行して実行し、移動する前にそれらのすべてを解決したいときに当てはまります。私の場合は、連続しています(コールバック終了時、他の関数が終了した時)ので、ここではうまくいきません。 – David

+0

受け入れられる答えは良く見えますが、私はこのような意味を持っていました:$ .when(getList(....))。done(function(){newReportSelection.apply($( "#report"));}); –

+0

私はそれを試していました(getList()呼び出しの周りに約束しています)。そしてその方法は、関数が終了するとすぐに完了したとみなされました。アヤックスの要求を送ってきたが、それが終わるのを待たずに。だから私はまだコールバックが終了するのを待たずに、関数内のajax呼び出しの約束をするのはなぜか分かりませんが、リクエストの約束を返す理由は(受け入れられた答えから)うまくいきます。 – David

関連する問題