1. 程式人生 > >使用ajax得到返回值時執行順序問題

使用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

使用ajaxsuccess無法得到返回的問題

今天在使用ajax時,一直在除錯,請求路徑和資料都沒問題,但是就是得不到資料,很是疑惑 原始碼時這樣的 <script> $(document).ready(function(){ $('[type=button]').click(function