1. 程式人生 > >React-ajax-解決非同步小技巧-非同步下beforeSend小用法

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

ReactAjax非同步解決技巧

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 等其他文件設置了通用的緩