1. 程式人生 > >extjs 迴圈執行多個非同步請求時,引數和後臺以及相關問題和衍生問題的處理

extjs 迴圈執行多個非同步請求時,引數和後臺以及相關問題和衍生問題的處理

在Extjs中,非同步請求的寫法:

Ext.Ajax.request({
	url: '***.action',
	//async: false,
	params: {
		p1: v1,
		p2: v2
		...
	},
	success: function(response, options){
		//TODO
	}
}); 
其中,若想變成同步請求,只需要在配置項中新增async: false,預設true。

配置說明:

url,訪問的請求地址;

params,引數物件,為請求提供的條件;

success,當請求執行成功後,會進入該回調方法。

說到這裡,我們先來回憶一下什麼是非同步請求,簡單來說就是不需要等待上一個請求的返回便可執行;簡單的說,若發起了10次非同步請求,且中間過程用時極短,那麼我們可以看作這10次請求是一起訪問目標地址的;

這裡我用一個迴圈來舉例說明非同步(類似Java多執行緒)的一些問題和解決方法。

//5個不同物件(結構相同,內容不同)
var params = [obj1, obj2, obj3, obj4, obj5];
for(var i = 0; i < params.length; i++){
	var param = params[i];
	Ext.Ajax.request({
		url: '?',
		params: {
			key: param.key,
			fileName: param.fileName
		},
		success: function(response, options){
			console.info(i);//標記1
			append(param.config);//標記2
		}
	});
}
問題1:當迴圈結束,標記1處輸出的值分別是多少?

問題2:該方法傳遞的config物件是否是同一物件?

你心中是否有了答案?

首先第一個問題,答案是一共輸出了5次5,有沒有答對?我想應該沒有答對是吧,那麼為什麼是這樣一種輸出結果,而不是0,1,2,3,4,原理則稍後再說明。

再來看第二個問題,答案是同一個物件,是不是出乎意料?你說,param物件不是迴圈得到的嗎,為什麼會是同一物件,這裡原理和第一問是一樣的。

現在我就來說下為什麼是這樣一種結果。首先,我們要注意到這是一個非同步請求,它不會像同步方法一樣非要等到返回結果(這裡的返回結果就是success回撥函式,當請求正確執行完成後就會呼叫該回調函式,告訴請求執行完了)才會進入下次迴圈,而是直接把所有迴圈次數都走完了,說到這裡是不是開始有點明白了?這裡我再說兩個相關資料:迴圈時間,請求執行時間。假設這裡的迴圈執行完畢只需要100ms,而每次請求的執行時間是300ms,那麼這意味著當請求執行結束進入success函式時,我們的i變數已經連迴圈的退出判定都已經執行完了,所以此時的變數i就是5,同樣的道理,param物件也是一樣,所以執行結果就是之前提到的那樣。(有個群友很好的解釋了這個問題:在進入回撥之前,老五已經出發了)

那麼新問題來了,怎麼才能夠輸出0,1,2,3,4以及得到不同的引數物件呢?

方法1:同步,即把async: false寫上即可,但這樣就變成了同步了;

方法2:將這些區域性變數封裝到請求中。

不知道你有沒有注意到回撥函式success中的2個引數options和response?他們是什麼呢,options就是請求的整個物件(即request({...})紅色部分),response就是後臺響應物件,包括返回結果。

既然取外部的區域性變數不行,那直接從請求物件中取值總不會錯了吧。你可能會問,這樣難道就不會是得到最後一次請求的內容?如果你知道類封裝和類例項就應該明白了,

由於每次請求傳遞的都是一個新的物件(類例項),並且在請求執行完成後反饋給options,當我們從options物件中取出自己定義的引數時,則和傳入時保持一致,就不會出現之前的問題了。

舉個自定義的例子:

Ext.Ajax.request({
	url: '?',
	//名字自定,在用的時候知道就好,但不要和其他配置名重名
	definedParams: {
		?
	},
	success: function(response, options){
		//得到自定義引數
		var ps = options.definedParams;
	}
});

這裡,我再提一點,我測試使用的是Struts結合Spring,Struts預設是多例,而Spring預設是單例,用Spring管理建立Action例項物件,在多個非同步請求同時訪問這個Action時,會造成引數混亂(因為是單例),所以我把Spring也改成了多例,在bean的配置中新增屬性scope="prototype"即可。

如果你使用的是servlet來做請求攔截的話,那就不用考慮了。

相關推薦

extjs 迴圈執行非同步請求引數後臺以及相關問題衍生問題的處理

在Extjs中,非同步請求的寫法: Ext.Ajax.request({ url: '***.action', //async: false, params: { p1: v1, p2: v2 ... }, success: function(resp

前端踩坑小結:非同步請求在同一個函式裡面執行的同步問題之promise的用法。

今天用VUE編寫專案時,涉及到兩個非同步請求在一個方法裡面對同一個變數進行操作,之前自己都沒意識到多個非同步請求對同一變數進行操作的時候會導致資料錯誤,結果今天除錯了半天,才想到了這個問題。也是怪自己還是一個新手,對於這種常識性的錯誤都不敏感。 於是自己查了一下相關資料,發

[轉]ajax請求控制執行順序或全部執行後的操作

on() .when ati ack login tps als fun lan 本文轉自:https://blog.csdn.net/fsdad/article/details/71514822 一、當確保執行順序時: 1、 請求加async: false,,

jquery $.when()非同步請求成功後再執行後續方法

$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) ).done(function( a1, a2 ) { // a1 and a2 are arguments resolved for the page1 and

ajax請求控制執行順序或全部執行後的操作

一、當確保執行順序時: 1、 請求加async: false,,這樣所有的ajax就會同步執行,請求順序就是程式碼順序 2、$.when($.ajax(            {async: false,                url : url1        

非同步請求執行順序問題。

情景一:多個非同步請求,虛擬碼:Ajax1(); Ajax2(); Ajax3();這三個Ajax請求並不存在執行順序,也就是2和3並不會等第一個Ajax請求完成再去執行,而是直接執行如果想要達到順序執行的效果,可以通過回撥函式來完成,虛擬碼:$.ajax({url:"ser

Java異步執行HTTP請求的例子(需要apache http類庫)

ride 同步 conn done 例子 latch block org ftw 直接上代碼 package org.jivesoftware.spark.util; import java.io.IOException; import java.uti

一個頁面有script標籤執行順序

JavaScript直譯器在執行指令碼時,是按塊執行的。通俗地說,就是瀏覽器在解析HTML文件流時,如果遇到一個script標籤,則JavaScript直譯器會等到這個程式碼塊都載入完成後,先對程式碼塊進行預編譯,然後再執行。執行完畢後,瀏覽器會繼續解析下面的HTML文件流,同時JavaSc

js非同步請求

一,兩個(或多個)js非同步併發執行,怎麼在兩個AJax非同步操作之後執行一個新的操作 原題來自 ES6 方法 1.Promise 包裝非同步ajax操作,2.定義async 函式,3.用await等待promise資料非同步獲取完成這一種方法簡潔高效,下面請看我專門給你寫的示例程式碼

發現一臺機器中同時執行Oracle例項。。。

發現一臺機器中同時執行多個Oracle例項時,最好保證 [OracleHome]/network/admin/listener.ora 檔案的 SID_LIST_LISTENER 段中 要對應每個例項都有一段宣告 其實這是個很簡單的問題,呵呵,只是偶以前一直沒留意過,今天剛剛

# 如何使用Python3.5並行執行web請求(不適用aiohttp

> 作者的生產環境剛從2.6升級到3.5.0,但滿足不了aiohttp的最低版本需求。所以在有了這篇文章,如何改造程式碼,充分利用python3.5 asyncio提供的非同步功能。原文連結 近日IT部門最終將我們工作環境的分散式Python版本升級到了3.5.0。這對從2.6版本來說是一次巨大的升

在同一個tomcat下部署springboot專案springboot專案無法正常啟動的問題

這個問題是基於,不使用springboot內建的tomcat會產生(即使用自己的tomcat時)。 今天在部署springboot專案的時候遇到了一個問題,怎麼部署都訪問不了,在網上查了很多原因,什麼pom.xml中依賴沒加,或者依賴衝突等等 各種原因都試了 ,結果還是訪問不了,這就

使用pyinstaller打包py檔案遇到的no module ...exe檔案一閃而過自定義模組打包等問題

1.跳過pyinstaller的安裝,自行谷歌 2. 用cmd cd到你想要打包的py檔案所在的資料夾下面,這裡我的資料夾是ceshi;我需要打包的檔案為main.py、a1.py、a2.py 3.執行命令pyi-makespec main.py,這裡將會根據你的mai

socket 存在客戶端一對一連線

1、連線的客戶端實體類package com.example.demo.socket3; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;

JavaScript 中 當用live繫結同名事件如何移除事件。

先介紹一下我的問題出現的環境: 公司用的dwz框架,需求是在一個頁面點選,載入一個dialog彈出框,每一個頁面都是一個單獨的jsp檔案:其中在彈出的dialog的那個頁面檔案中,有下面一段程式碼: 因為dwz框架的實現機制,就是把當前的程式碼片段載入到主頁面中,所以想給

RF合並output文件並生成新的logreport文件

結果 png 多個 路徑 行合並 保存 rep out ron 合並兩個output文件並生成新的log和report文件命令: rebot -d 合並生成的log和report文件保存路徑 第1個output文件 第2個output文件 通過執行套件層.txt將結

Ajax 以GET方式請求引數中包含 "#" 特殊字元的處理

現象 在使用 jquery 的ajax呼叫後臺的介面時,如果是get方式的話,當引數中含有”#”這些等對於URI而言有著特殊含義的符號時,發現“#”字元後面的資訊全被裁掉了。 比如: var url= "xxxx?name=" + "wz#aaa"

node的express框架接收get/post請求引數獲取方式

一.接收get請求 情況一:引數是url的一部分: 1 eg:router.get('/nodeServer/dataSet/page/:name/:pageNum/:pageSize', function(request, resopnse){ 2 // 獲取引數name , pageNum

現在有非同步操作ajax請求,我們需要當所有非同步請求都成功的時候,執行後續操作

1》場景: 現在有多個非同步操作ajax請求,我們需要當所有非同步請求都成功的時候,執行後續操作 2》方法 方法一:通常的講,我們可以設定一個flag變數,然後在各自的ajax的成功回撥內去維護這個變數數量,當滿足條件時,我們來觸發後續函式 方法二: jq的$.wh

feign 發送請求參數的寫法

method 接受 public ati -s state dna www. orm 第一:傳參方式寫法,當參數個數大於2個時,需要用@RequestParam @PostMapping(value = "/configReader/configValue.do",hea