亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

用Promise解決多個異步Ajax請求導(dǎo)致的代碼嵌套問題

DobbyKim / 2862人閱讀

摘要:問題前端小同學(xué)在做頁面的時候,犯了個常見的錯誤把多個請求順序著寫下來了,而后面的請求,對前面請求的返回結(jié)果,是有依賴的。經(jīng)提醒,發(fā)現(xiàn)從版開始,返回的就是對象了,那么函數(shù)可以直接返回的返回值

問題

前端小同學(xué)在做頁面的時候,犯了個常見的錯誤:把多個Ajax請求順序著寫下來了,而后面的請求,對前面請求的返回結(jié)果,是有依賴的。如下面的代碼所示:

var someData;
$.ajax({
            url: "/prefix/entity1/action1",
            type: "GET" ,
            async: true,
            contentType: "application/json",
            success: function (resp) {
                //do something on response
               someData.attr1 = resp.attr1;
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                //在這個頁面里,所有的請求的錯誤都做同樣的處理
                if (XMLHttpRequest.status == "401") {
                    window.location.href = "/login.html";
                } else {
                    alert(XMLHttpRequest.responseText);
                }
            }
        });

$.ajax({
            url: "/prefix/entity2/action2",
            type: "POST" ,
            dataType: "json",
            data: JSON.stringify(someData),
            async: true,
            contentType: "application/json",
            success: function (resp) {
                //do something on response
             },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                //在這個頁面里,所有的請求的錯誤都做同樣的處理
                if (XMLHttpRequest.status == "401") {
                    window.location.href = "/login.html";
                } else {
                    alert(XMLHttpRequest.responseText);
                }
            }
        });

以上代碼有兩個問題:
*首先就是執(zhí)行順序不能保證,action2很可能在action1返回之前就發(fā)出了,導(dǎo)致someData.attr1這個參數(shù)沒能正確傳出
*其次兩個ajax請求的代碼重復(fù)很嚴重

思路

代碼重復(fù)的問題相對好解決,尤其是在自己的項目里,各種參數(shù)可以通過規(guī)范定死,封裝一個參數(shù)更少的ajax方法就好了

//url:地址
//data:數(shù)據(jù)對象,在函數(shù)內(nèi)部會轉(zhuǎn)化成json串,如果沒傳,表示用GET方法,如果傳了,表示用POST方法
function ajax(url, data, callback) {
        $.ajax({
            url: url,
            type: data == null ? "GET" : "POST",
            dataType: "json",
            data: data == null ? "" : JSON.stringify(data),
            async: true,
            contentType: "application/json",
            success: function (resp) {
                callback(resp);
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                if (XMLHttpRequest.status == "401") {
                    window.parent.location = "/enterprise/enterprise_login.html";
                    self.location = "/enterprise/enterprise_login.html";
                } else {
                    alert(XMLHttpRequest.responseText);
                }
            }
        });
}

這樣只有url,data和callback三個必要的參數(shù)要填,其他都定死了

執(zhí)行順序的問題,可以把第二個請求放在第一個請求的回調(diào)里,形如:

ajax("/prefix/entity1/action1",null, function(resp){
     //do something on response
     someData.attr1 = resp.attr1;
     ajax("/prefix/entity2/action2", someData, function(resp){
          //do something on response
     }
};

至此問題似乎解決得很完美,但可以想見,如果請求不止兩個,而是4、5個,同時還有其他異步操作(比如我們的頁面里有Vue對象的初始化),相互之間有依賴關(guān)系,光是這樣層層疊疊的括號嵌套,就已經(jīng)讓人頭暈了。

需要找到一種方法,讓異步調(diào)用的表達看起來像同步調(diào)用一樣。

正好最近看了阮一峰老師關(guān)于ES6的書,而且用戶也沒有強硬要求兼容IE瀏覽器,于是就選擇了Promise的方案

解決方案

引入Promise
其實現(xiàn)代瀏覽器都已經(jīng)內(nèi)置支持了Promise,連第三方庫都不需要了,只有IE不行,放棄了

改造ajax封裝函數(shù),在成功的時候調(diào)用resolve(),失敗的時候調(diào)用reject(),并且返回Promise對象

function ajax(url, data, callback) {
    var p = new Promise(function (resolve, reject) {
        $.ajax({
            url: url,
            type: data == null ? "GET" : "POST",
            dataType: "json",
            data: data == null ? "" : JSON.stringify(data),
            async: true,
            contentType: "application/json",
            success: function (resp) {
                callback(resp);
                resolve();
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                if (XMLHttpRequest.status == "401") {
                    window.parent.location = "/enterprise/enterprise_login.html";
                    self.location = "/enterprise/enterprise_login.html";
                } else {
                    alert(XMLHttpRequest.responseText);
                }
                reject();
            }
        });
    });
    return p;
}

修改調(diào)用端

ajax("/prefix/entity1/action1",null, function(resp){
     //do something on response
     someData.attr1 = resp.attr1;
}).then(
     ajax("/prefix/entity2/action2", someData, function(resp){
          //do something on response
     }
).then(
     initVue() ;
).then(
     //do  something else
)

至此完美解決。

經(jīng)@miroki 提醒,發(fā)現(xiàn)Jquery從1.5版開始,返回的就是thenable對象了,那么ajax函數(shù)可以直接返回$.ajax()的返回值

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/81769.html

相關(guān)文章

  • Promise學(xué)習總結(jié)

    摘要:引擎線程也稱為內(nèi)核,負責處理腳本程序例如引擎引擎線程負責解析腳本,運行代碼。對象代表一個未完成但預(yù)計將來會完成的操作。注意一旦新建就會立即執(zhí)行它屬于,無法取消。 寫在前面: 第一遍學(xué)Promise時, 只是大概過了一遍, 感覺學(xué)的不夠深入, 這一篇算是對之前的一個總結(jié)吧. Promise在ES6中也屬于一個較難理解的一部分; 所以在學(xué)習一個比較難理解的知識點時, 我們可以圍繞這個知識點...

    twohappy 評論0 收藏0
  • JavaScript 異步進化史

    摘要:簽訂協(xié)議的兩方分別是異步接口和。在異步函數(shù)中,使用異常捕獲的方案,代替了的異常捕獲的方案。需要注意的是,在異步函數(shù)中使異步函數(shù)用時要使用,不然異步函會被同步執(zhí)行。 同步與異步 通常,代碼是由上往下依次執(zhí)行的。如果有多個任務(wù),就必需排隊,前一個任務(wù)完成,后一個任務(wù)才會執(zhí)行。這種執(zhí)行模式稱之為: 同步(synchronous) 。新手容易把計算機用語中的同步,和日常用語中的同步弄混淆。如,...

    luzhuqun 評論0 收藏0
  • 從源碼看 Promise 概念與實現(xiàn)

    摘要:從源碼看概念與實現(xiàn)是異步編程中的重要概念,它較好地解決了異步任務(wù)中回調(diào)嵌套的問題。這些概念中有趣的地方在于,標識狀態(tài)的變量如都是形容詞,用于傳入數(shù)據(jù)的接口如與都是動詞,而用于傳入回調(diào)函數(shù)的接口如及則在語義上用于修飾動詞的副詞。 從源碼看 Promise 概念與實現(xiàn) Promise 是 JS 異步編程中的重要概念,它較好地解決了異步任務(wù)中回調(diào)嵌套的問題。在沒有引入新的語言機制的前提下,這...

    kel 評論0 收藏0
  • 【筆記】 你不知道JS讀書筆記——異步

    摘要:異步請求線程在在連接后是通過瀏覽器新開一個線程請求將檢測到狀態(tài)變更時,如果設(shè)置有回調(diào)函數(shù),異步線程就產(chǎn)生狀態(tài)變更事件,將這個回調(diào)再放入事件循環(huán)隊列中。 基礎(chǔ):瀏覽器 -- 多進程,每個tab頁獨立一個瀏覽器渲染進程(瀏覽器內(nèi)核) 每個瀏覽器渲染進程是多線程的,主要包括:GUI渲染線程 JS引擎線程 也稱為JS內(nèi)核,負責處理Javascript腳本程序。(例如V8引擎) JS引擎線程負...

    junnplus 評論0 收藏0
  • 漫談promise使場景

    摘要:能幫我們解決什么痛點實現(xiàn)異步執(zhí)行,在未出現(xiàn)前,我們通常是使用嵌套的回調(diào)函數(shù)來解決的。那么,接下來我們看一下使用的實例可以傳入兩個參數(shù)表示兩個狀態(tài)的回調(diào)函數(shù),第一個是,必選參數(shù)第二個是,可選參數(shù)的方便之處。 深入理解promise 對于現(xiàn)在的前端同學(xué)來說你不同promise你都不好意思出門了。對于前端同學(xué)來說promise已經(jīng)成為了我們的必備技能。 那么,下面我們就來說一說promise...

    劉德剛 評論0 收藏0

發(fā)表評論

0條評論

DobbyKim

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<