React-ajax-解決非同步小技巧-非同步下beforeSend小用法
非同步問題
1. 設定setTimeout來延遲下一步操作的執行時間,來解決ajax網路請求和下一步操作的非同步衝突。需要注意的是,
定時器的時間設定一定要大於等於網路請求的時間。
程式碼如下:
// 定義狀態機 constructor(props, context) { super(props, context); this.state = { content:null } } //網路請求方法 Add = () => { var formData = new FormData($("#userForm")[0]); // 定位到userForm表單,並將表單定位轉為FormData物件 $.ajax({ url: '/add', //網路請求url地址 type: 'POST', data: formData, //表單資料 cache: false, contentType: false, //或者 contentType:multipart/form-data均可以,multipart/form-data表示可以上傳下載檔案(既可以傳送文字資料,也支援二進位制資料上載),表明傳輸的資料要用到多媒體傳輸協議,由於多媒體傳輸的都是大量的資料,所以規定上傳檔案必須是post方法;contentType預設為application/x-www-form-urlencoded不能上傳檔案 processData: false, success: function (data) { console.log('成功'); this.setState({content:'修改成功'}) }.bind(this), error: function (xhr, status, err) { }.bind(this) }); } //執行操作 this.add(); setTimeout(() => { if(this.state.content=='修改成功'){alert('修改成功')} else{alert('修改失敗')} }, 1000); //如果不加1秒定時延遲,會直接進行判斷,即未等網路請求結束便進行了判斷
2. 設定ajax的async屬性
async預設屬性是true,表示非同步執行, 如果需要同步請求,則修改成false
注意async為false的時候,這時候鎖住了瀏覽器,使用者其他操作都必須等到網路請求完成後才能執行。
/ 定義狀態機 constructor(props, context) { super(props, context); this.state = { content:null } } //網路請求方法 Add = () => { var formData = new FormData($("#userForm")[0]); // 定位到userForm表單,並將表單定位轉為FormData物件 $.ajax({ url: '/add', //網路請求url地址 type: 'POST', data: formData, //表單資料 async:false, cache: false, contentType: false, //或者 contentType:multipart/form-data均可以,multipart/form-data表示可以上傳下載檔案(既可以傳送文字資料,也支援二進位制資料上載),表明傳輸的資料要用到多媒體傳輸協議,由於多媒體傳輸的都是大量的資料,所以規定上傳檔案必須是post方法;contentType預設為application/x-www-form-urlencoded不能上傳檔案 processData: false, success: function (data) { console.log('成功'); this.setState({content:'修改成功'}) }.bind(this), error: function (xhr, status, err) { }.bind(this) }); } //執行操作 this.add(); if(this.state.content=='修改成功'){alert('修改成功')} else{alert('修改失敗')}
提高使用者體驗-beforeSend&complete
場 景:在ajax傳送網路請求的時候,使用者重複點選提交按鈕,造成後臺儲存了重複的資料
解決方案:在提交ajax的時候,有全域性事件和區域性事件在執行,詳情檢視ajax-全域性事件,
beforeSend和complete函式屬於區域性事件。
非同步與同步操作下beforeSend和complete的區別:
var obj=0; $.ajax({ url:"../data/test.txt", contentType:"application/json", type:"POST", cache:false, async:true, beforeSend:function(){ $('#queryForm').hide(); }, success:function(result){ obj=result; }, complete:function(){ } }); console.log(obj); }); }
async:true 這種情況是非同步方式,當ajax傳送請求前,會先執行ajax塊中beforeSend裡面的程式碼,如果beforeSend裡面有Dom的操作,就可以立即對Dom進行渲染,當ajax傳送請求後,在等待server端返回資料的過程中,程式會繼續執行ajax外面的程式碼塊,知道伺服器返回正確的結果才會去執行success方法,因此,在執行success前,Dom隱藏,obj為0
async:flase 這時候ajax請求是同步的,這樣的話,當ajax傳送請求前,回西安之行ajax塊中beforeSend路面的程式碼,如果beforeSend裡面的程式碼有Dom操作,不會立即對Dom渲染,而是等到complete執行完成之後,才會渲染Dom,當ajax傳送請求成功之後,才會執行ajax塊外面的程式碼,因此,在執行完成complete之後,Dom才隱藏,obj=result
可以解決的場景:
1 防止重複資料
// 提交表單資料到後臺處理
$.ajax({
type: "post",
data: studentInfo,
contentType: "application/json",
url: "/Home/Submit",
beforeSend: function () {
// 禁用按鈕防止重複提交
$("#submit").attr({ disabled: "disabled" });
},
success: function (data) {
if (data == "Success") {
//清空輸入框
clearBox();
}
},
complete: function () {
$("#submit").removeAttr("disabled");
},
error: function (data) {
console.info("error: " + data.responseText);
}
});
2 模擬Toast效果
ajax請求伺服器載入資料列表的時候顯示loading('載入中,請稍後......')
$.ajax({
type: "post",
contentType: "application/json",
url: "/Home/GetList",
beforeSend: function () {
$("loading").show();
},
success: function (data) {
if (data == "Success") {
// ...
}
},
complete: function () {
$("loading").hide();
},
error: function (data) {
console.info("error: " + data.responseText);
}
});
相關推薦
React-ajax-解決非同步小技巧-非同步下beforeSend小用法
非同步問題1. 設定setTimeout來延遲下一步操作的執行時間,來解決ajax網路請求和下一步操作的非同步衝突。需要注意的是, 定時器的時間設定一定要大於等於網路請求的時間。 程式碼如下:// 定義狀態機 constructor(props, contex
css3實現小圖示向下引導小箭頭動態效果
css3實現小圖示向下引導小箭頭動態效果 網上轉的 ,記錄下來,方便下次用到 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <tit
React中Ajax非同步解決小技巧
1.設定 setTimeout定時器,通過延遲下一操作的執行時間,來解決ajax網路請求和下一操作非同步的衝突(注意:時長的設定要大於等於網路請求的執行時間),程式碼如下 // 定義狀態機
php + ajax非同步上傳檔案 阿星小棧
html程式碼 <head> <script src="/libs/jQuery/jquery-2.2.4.min.js"></script> <script> var url = "
使用JQuery AJAX 解決vue中圖表渲染非同步問題
vue一般使用axios 傳送請求,得到 一個promise物件,一般對資料進行處理是在.then()方法中執行,如: CommonApi.EnumType.getBusinessTypes({}).then(data => { CommonApi.Enum
微信小程式用Promise解決wx.request的非同步時序問題
在app.js中寫一個公用方法(例如獲取使用者資訊),在頁面中要根據使用者資訊變動頁面顯示內容。 由於網路和非同步的問題,經常發生資料獲取在改動頁面顯示內容的程式碼之後。 為了解決這個時序非同步的問題,採用了Promise。 注意:網上查到微信小程式已於2017.12支
ajax中async同步和非同步的區別和使用技巧
在網上看了很多關於ajax中同步和非同步的區別,這個同步的意思是當JS程式碼載入到當前AJAX的時候會把頁面裡所有的程式碼停止載入,頁面出去假死狀態,當這個AJAX執 行完畢後才會繼續執行其他程式碼頁
通過一個小技巧可以讓flash和iframe的在ie下遮擋問題解決
最近在研究一個openlaszlo platform平臺的一個小bug.發現了一個在ie下很有意思的bug.一般iframe和flash混用經常都會碰到。ie上解決方式大都選擇wmode設定為transparent.但是swf在transparent的情況下,感應不到mou
微信小程式非同步請求解決方法
小程式一般需要用token,去識別使用者身份,每次獲取到token之後,再進行下一步操作。再獲取到token之後,將token同步快取, app.js: login: function () { var that = this; retur
Linux下通過find命令進行rm文件刪除的小技巧
ase test sysconfig ger sdn tun 執行過程 fun alt 我們常常會通過find命令進行批量操作。如:批量刪除舊文件、批量改動、基於時間的文件統計、基於文件大小的文件統計等。在這些操作其中,因為rm刪除操作會導致文件夾結構變化,
C#解決Linq OrderBy() 失效的小技巧
服務 class team keyword 解決 asc rip param 正常 前言 前幾天的一個數據列表中我用了Linq GroupBy 和OrderBy。 排序在本機正常使用,發到測試後排序死活不對,很是郁悶,總以為是程序問題。於是請教了另外一個同事。有了以下的答案
從零開始學習html(十五)css樣式設置小技巧——下
right ron pos 瀏覽器 spl pan esc 插入 ccf 六、垂直居中-父元素高度確定的單行文本 1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta charset="
React Native頂|底部導航使用小技巧
開發 adding indicator tab visible 分別是 route 如果 label 導航一直是App開發中比較重要的一個組件,ReactNative提供了兩種導航組件供我們使用,分別是:NavigatorIOS和Navigator,但是前者只能用於iOS平
在訪問RESTful接口時出現:Could not write content: No serializer found for class 的問題解決小技巧收集
onu restfu zab blank rest org lips 收集 規範 註意:市面上對於寫RESTful是用RestFul,其實是不規範的,標準寫法RESTful。 在Java上,處理這個應該是沒有繼承Serializable類,然後通過Eclipse生成ser
Shell腳本編程小技巧(1)-如何解決腳本中多行重定向結束符不用對齊到行首
shell 多行重定向 1、what?問題需求是什麽? 首先需求從何而來呢,主要是編寫shell腳本,用cat 進行多行輸入重定向的時候,結束符必須要對齊行首,格式不好看。 2、how?怎麽解決這個問題? 首先百度,google搜索了下,結果就是說的多的就是shell多行重定向沒有解決實際問題,可能是
問題解決方案小技巧1:假如你的Java界面打不開或者長時間假死
打不開 技巧 方案 時間 http 分享圖片 In alt mage 問題解決方案小技巧1:假如你的Java界面打不開或者長時間假死
幹貨|微信小程序線上線下推廣的方法和銷售話術小技巧分享
引擎優化 就是 lan 開發 電影院 時間 會有 app 領取 一款小程序在被開發後,若想獲得廣泛的用戶群體,就得靠一些巧妙地話術宣傳和推廣措施。那麽問題來了,微信小程序推廣和話術有哪些呢?具體要怎麽操作?別著急,請聽小編來跟大家一一道來。 小程序推銷話術小技巧 1、有自
shell腳本編程小技巧(2)——如何解決多行重定,變量不被shell解釋
tps log shell腳本 ces ESS size 分享 sha blog 參考資料 https://blog.csdn.net/ccwwff/article/details/48519119 例子 原理 ![]shell腳本編程小技巧(2)——如何解決多行重定,
ajax小技巧,防止多次點擊發送多個請求
設置 function click als var div ajax timeout 防止 var isAjax=false;$("btn").click(function(){if(isAjax)return; isAjax=true;setTimeout(fun
解決瀏覽器緩存導致頁面非最新的小技巧
ssa 需求 標識 固定 ges 方式 執行 etime 服務 解決瀏覽器緩存導致頁面非最新的小技巧 為了保證頁面訪問性能最佳,我們通常在服務端會設置緩存策略,比如說帶有 hash 類型的文件會設置過期時間為永久, 非 hash 文件比如 html 等其他文件設置了通用的緩