問題描述

我已經在谷歌搜尋這個,並在我的錯誤修復列表中避免這個錯誤現在很多時間,但我終於到達了列表的最後,我最後要使一個函式返回 true /false 來表示是否驗證是否成功。

我正在使用 ajax 將某些欄位與已經在 db 中的欄位進行比較,預設情況下,$.post()方法是非同步操作的。

我在呼叫 onSuccess 中設定一個變數,呼叫方法沒有得到響應,所以我的所有 js /jquery 在 pageLoad 上失敗… 我更喜歡如果我仍然可以繼續使用 $.post 方法。

最佳解決方案

jQuery< 1.8

我建議您使用 $.ajax()而不是 $.post(),因為它可以更自定義。

如果您呼叫 $.post(),例如:

$.post( url, data, success, dataType );

你可以把它變成 $.ajax()的等價物:

$.ajax({
  type: 'POST',
  url: url,
  data: data,
  success: success,
  dataType: dataType,
  async:false
});

請注意 $.ajax()引數物件末尾的 async:false

這裡有 $.ajax()引數的詳細資訊:jQuery.ajax() – jQuery API Documentation


編輯:jQuery 1.8 “async:false” 棄用通知

對於 jQuery> = 1.8,解決方案有所不同。

現在的想法是,由於現在 jQuery 不會阻止 UI,要麼使用外掛 (例如 BlockUI),要麼在呼叫 $.ajax()之前手動新增一個疊加層,而是從 AJAX .done()回撥中刪除它。

請檢視 this answer 以獲得可能的實現。

次佳解決方案

如果要同步請求,將 async 屬性設定為 false 作為請求。檢視 jQuery AJAX Doc

第三種解決方案

從 Jquery 檔案中:將 async 選項指定為 false 以獲取同步 Ajax 請求。然後,您的回撥可以在您的母親功能繼續進行之前設定一些資料。

以下是您的程式碼,如果更改如下所示:

beforecreate: function(node,targetNode,type,to) {
    jQuery.ajax({
         url:    url,
         success: function(result) {
                      if(result.isOk == false)
                          alert(result.message);
                  },
         async:   false
    });          
}

這是因為 $ .ajax 是唯一可以設定非同步性的請求型別

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇