使用ajax得到返回值時執行順序問題
今天想利用JQuery框架ajax寫一個工具方法,引數分別為ajax請求傳送的地址和引數。可以供應用程式的多個模組直接呼叫,當然了,需要有一個json格式的返回值。程式碼如下:
function getDate(uri,param){ var list; $.ajax({ type:"post", url:'listAllToJson_planTask', data:param, dataType:json, error:function(){ alert("獲取資料失敗"); }, success:function(data){ list = eval('('+data+')'); //1 } }); if(list!=null){ alert(list.data); //2 return list.data; } }
var listDate = getDate("listAllToJson_planTask","");
alert("得到值"+listDate);//3
在IE執行後每次都發現執行次序是③→②→①,也就是說,在ajax得到值之前,方法已經返回一個空值(undefined)給呼叫的方法。在firefox執行也是如此。但使用firebug在①處斷點除錯等待幾秒後向下執行,發現結果就是正常的執行順序,也就是①→②→③。由此可以推斷ajax執行的方式是非同步執行,也就是說在ajax請求資料的同時,ajax程式碼外的程式碼依然繼續執行。這是一個很好的機制,可以防止請求時間過長帶來的螢幕死鎖等問題。但在此例中需要利用到ajax的返回值的時候就不能得到正確的結果了。
上網搜了一下解決方法,大致有兩種。
第一種:取消非同步機制。
①加入async:false引數(在預設情況下async引數的值為true)
function getDate(uri,param){ var list; $.ajax({ type:"post", url:'listAllToJson_planTask', data:param, dataType:json, async:false, error:function(){ alert("獲取資料失敗"); }, success:function(data){ list = eval('('+data+')'); } }); if(list!=null){ alert(list.data); return list.data; } }
這樣就可以正常返回值了。
②設定ajax的全域性屬性
$.ajaxSetup({
async: false
});
第二種:在此方法的引數中加入一個回撥函式
function getDate(uri,param,function1){
var list;
$.ajax({
type:"post",
url:'listAllToJson_planTask',
error:function(){
alert("獲取資料失敗");
},
// async:false,
success:function(data){
list = eval('('+data+')');
function1(list);
}
});
// if(list!=null){
// alert(list.data);
// return list.data;
// }
}
var listDate = getDate("listAllToJson_planTask","",function(list){
alert("回撥函式"+list);
});
雖然在ajax程式碼外部執行時非同步方式,但是在ajax的success回撥函式內部,執行的方式仍然是按順序執行。此方式沒有返回值,而是在利用ajax得到資料以後去執行傳入的回撥函式從而達到想要的結果。當然了這裡的listDate仍然是undefined,但這已經不是我們需要的了。
在大多不嚴格要求順序的情況下建議首選第二種方案,這樣程式碼緊湊一些,而且沒有違反ajax非同步提交的初衷。
本人菜鳥,如果有遺漏的地方請留言告知,謝謝。
相關推薦
使用ajax得到返回值時執行順序問題
今天想利用JQuery框架ajax寫一個工具方法,引數分別為ajax請求傳送的地址和引數。可以供應用程式的多個模組直接呼叫,當然了,需要有一個json格式的返回值。程式碼如下: function getDate(uri,param){ var list; $.ajax(
Golang中defer、return、返回值之間執行順序的坑
Golang中defer、return、返回值之間執行順序的坑 原文連結:https://studygolang.com/articles/4809 Go語言中延遲函式defer充當著 cry...catch 的重任,使用起來也非常簡便,然而在實際應用中,很多gopher並沒有真正搞明白de
java類加載時執行順序
width style new print 分享圖片 sta pub mage ati 源代碼 class HelloA { public HelloA() { System.out.print("A"); }
Python異常捕捉try except else finally有return時執行順序探究
復制代碼 捕獲 key clas 沖突 light 問題 進入 odi 轉載自 https://www.cnblogs.com/JohnABC/p/4065437.html 學習python或者其他有異常控制的編程語 言, 大家很有可能說try except finally
關於iframe和div窗口中ajax請求200狀態時執行的回調問題
site RR ces inpu 處理 XP 打印 來看 刷新問題 上一篇說了在ajax回調裏面處理iframe窗口的刷新問題,這一篇記錄一下遇到的一個分別在iframe和div窗口中ajax請求200狀態時執行的回調問題。 我們先來看一下ajax請求的寫法(這裏使用了j
表單檔案上傳下載ajax方式返回值
頁面引入:jquery-form.js function importSaleOrder(){ var file=$("#file").val(); if(file!=""){
【C/C++開發】類物件作為返回值時析構的情況說明
class Person { public: string name; public: Person() { name = "ttf"; } ~Person(){ cout << this->
Callable實現帶有返回值的執行緒
我們都知道執行緒是沒有返回值的,在Runnable介面中,只有一個抽象的Run方法,使用Callable我們能夠實現帶有返回值得的執行緒,下面是一個demo /** * */ package com.mingrisoft.threadone; impo
ajax請求返回值為404 路徑正確
ajax請求返回值為404 路徑正確 我使用ajax發起了使用者名稱是否存在的校驗 但是出現了404 然而我通過瀏覽器直接訪問是可以訪問到的,一直沒有想明白原因,404 找不到那麼瀏覽器是如何找到的
使用SqlParameter引數返回值時遇到的問題
原來早就知道可以在呼叫SQL Server的儲存過程,並指定引數的型別為ParameterDirection.Output來返回值,但是今天真正用起來的時候卻碰到了問題, 儲存過程: CREATE procedure SqlMembership_GetAllUsers(@Ap
Ext.Ajax獲取返回值(引數)
本文轉載自:http://blog.csdn.net/dingherry/article/details/6798816 [javascript] view plain copy Ext.Ajax.request({
ajax具有返回值,但是返回值無法使用
一般來說ajax只要獲取到返回值,那麼返回值就可以使用,如果返回來的值不能被使用,在請求返回頭中就可以大致看出端倪:很有可能是請求跨域限制了。 解決辦法如下: $.ajax({ typ
關於firefox(火狐)瀏覽器中ajax請求返回data時出現[object XMLDocument]的情況的分析
本來我們使用ajax來非同步處理資料時,有時候需要返回data,這時候我們在service(action)中使用下面的程式碼完成返回: HttpServletResponse response = ServletActionContext.getResponse(); r
使用$.ajax得不到返回值(不執行success後代碼)
問題:使用$.ajax更新動態更新dropDownList顯示內容時,接收頁面得不到返回值。無法執行success後代碼。 js程式碼: function set() { var postData = { keyword : $("#keyword").val()
[轉]多個ajax請求時控制執行順序或全部執行後的操作
on() .when ati ack login tps als fun lan 本文轉自:https://blog.csdn.net/fsdad/article/details/71514822 一、當確保執行順序時: 1、 請求加async: false,,
Ajax詳解及使用Ajax時的返回值類型有哪些?
itl use text 數據 .ajax ack 部分 $.ajax llb Ajax詳解 Ajax = 異步 JavaScript 和 XML。 Ajax 是一種用於創建快速動態網頁的技術。 通過在後臺與服務器進行少量數據交換,A
C++在單繼承、多繼承、虛繼承時,建構函式、複製建構函式、賦值操作符、解構函式的執行順序和執行內容
一、本文目的與說明 1. 本文目的:理清在各種繼承時,建構函式、複製建構函式、賦值操作符、解構函式的執行順序和執行內容。 2. 說明:雖然複製建構函式屬於建構函式的一種,有共同的地方,但是也具有一定的特殊性,所以在總結它的性質時將它單獨列出來了。
SSM整合html使用Ajax時,success獲取不到controller類的返回值的問題解決。
使用ajax對資料庫的執行刪除,資料可以正常刪除,就是controller方法可以執行,但是Ajax的success卻接收不到controller類刪除方法的返回值。卻一直執行Ajax的error。 我的ajax是這樣寫的: $.ajax({
多個ajax順序執行問題及ajax請求為同步時loading效果無意義的問題
ajax是一種常用的網頁區域性刷新技術,當請求資料時間較長或防止使用者多次點選等情況下,會在請求資料的過程中新增loading效果,提高使用者體驗。 當需要執行多個ajax並需要考慮執行順序時,可以使用ajax巢狀、同步、回撥三個方法。 1、ajax巢狀: $.ajax({ url : "ur
使用ajax時success無法得到返回值的問題
今天在使用ajax時,一直在除錯,請求路徑和資料都沒問題,但是就是得不到資料,很是疑惑 原始碼時這樣的 <script> $(document).ready(function(){ $('[type=button]').click(function