ajax 被使用時,常預設的就使用了非同步處理。
當遇到後面的程式碼對同樣的資料進行處理 或 要依賴前面ajax處理的結果時,就會導致資料處理結果不正確,未達到預期值。
且,debug時卻能正常完成功能,得到預期值。再就是多次測試,又有很少的機會會出現正確資料結果。
這就是ajax非同步和同步的問題,
debug時 程式一直處於同步的過程中執行程式碼。所以設定的非同步被無效化,看不到資料處理的異樣。
不debug時,就會出現資料處理的順序不對,導致結果不對。
解決方法就是將ajax的屬性async 改為 false 即:同步
//jquery的async:false,這個屬性 //預設是true:非同步,false:同步。 function submit_adjust(){ $.ajax({ type: "post", url: basePath + "/provinceKpi/submitAdjust.do", contentType: "application/json; charset=utf-8", data:JSON.stringify($('#form_dialog').serializeObject()), dataType: 'JSON', async: false, success: function (data) { alert("調整成功,並記錄!"); }, error: function () { alert('調整資料提交失敗'); }, complete: function () { } }); }
//調整按鈕的點選事件 function adjustment(){ BootstrapDialog.show({ title: 'kpi資料調整', size :BootstrapDialog.SIZE_WIDE, message: $('<div></div>').load(basePath + '/provinceKpi/dialog/adjust_dialog.do',{limit: 25}, function(data){ }), buttons: [ { label: '確認調整', action: function(dialog) { if(confirm("確認調整?")){ submit_adjust(); dialog.close(); $("#grid").bootstrapTable('refresh'); } } } ,{ label: '關閉', action: function(dialog) { dialog.close(); } }] }); }
//上面程式碼是我在開發中遇到的 /*先呼叫submit_adjust()方法,然後 接著又重新整理了列表,這兩個方法處理的是同一個表的資料,如果ajax採用了預設的非同步就會出現資料處理錯誤的現象*/