簡體   English   中英

使用JQuery,如何在繼續進行之前等待AJAX​​調用及其回調完成?

[英]Using JQuery, how to wait for both an AJAX call and its callback to finish before proceeding?

我的問題似乎與類似,但我無法通過這些答案解決。

簡而言之,在頁面加載時,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
}  

getList在各個地方都使用過,因此我無法將此(特定於頁面加載)newReportSelection()代碼添加到ajax回調函數中。
在getList()調用周圍放一個承諾不會等待Ajax調用,因為它是異步的。
將一個放在Ajax調用周圍等待它被發送,但是不等待回調函數被執行。
在回調函數中放一個也不可行,因為Ajax部分正在等待它,但是由於異步性,getList()繼續進行。

即使在Ajax調用上鏈承諾和回調函數都能正常工作,這看起來也很臟,而且是不受歡迎的。
有沒有辦法讓newReportSelection()調用等到整個getList()完成,而無需手動將Ajax調用設置為async: false

提前致謝。

從$ .get返回延期/應付款

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

那么您可以在promise .done()方法中調用后續操作:

getList('country', null, q, 'category:customer', null).done(function() {
    newReportSelection.apply($("#report")); 
});
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 );

https://api.jquery.com/jquery.when/中提取

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM