国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

AJAX并發(fā)請求控制

這篇具有很好參考價值的文章主要介紹了AJAX并發(fā)請求控制。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

AJAX、axios、fetch的區(qū)別

AJAX

Gmail開發(fā)人員發(fā)現(xiàn)IE里面有個XMLHTTPRequest對象來請求數(shù)據(jù)時,可以實現(xiàn)無刷新數(shù)據(jù)請求,所以使用這個特性,進行網(wǎng)絡數(shù)據(jù)請求,這就是AJAX的由來。
AJAX不是一個單詞,他的全稱是Asynchronous JavaScript and XML,就是異步的JavaScriptXML,它是一套用于創(chuàng)建快速動態(tài)網(wǎng)頁的技術(shù)標準,使用步驟如下:

創(chuàng)建異步XMLHttpRequest對象
設(shè)置請求參數(shù),包括請求的方法和URL等
發(fā)送請求
注冊事件,事件狀態(tài)變更會及時響應監(jiān)聽
在監(jiān)聽里面獲取并處理返回數(shù)據(jù)

所以AJAX的核心就是XMLHttpRequest對象,這是一個非常早的實現(xiàn)方法,也是兼容性最好的,已經(jīng)成為了瀏覽器標準,雖然我們現(xiàn)在都使用其它的API規(guī)范,但對象名字暫時還是用XML命名

axios

axios是一個基于PromiseHTTP庫,可以用在瀏覽器和node.js中,它底層還是基于XMLHttpRequest對象的,你可以認為它是一個方便的封裝庫,除了基礎(chǔ)請求數(shù)據(jù),它還增加了如下功能:

PromiseAPI的支持
支持請求攔截和響應、轉(zhuǎn)換請求數(shù)據(jù)和響應數(shù)據(jù)、取消請求
可以自動轉(zhuǎn)換JSON數(shù)據(jù)
支持防御XSRF

fetch

fetch就不是XMLHttpRequest對象了,fetch是原生的js對象,是ES6新增的通信方法。也就是說,它不依賴瀏覽器,fetch提供了一個理解的請求替換方案,可以提供給其它技術(shù)使用。我們主要需要了解下fetchajax的本質(zhì)區(qū)別:

fetch返回的是Promise,所以如果HTTP狀態(tài)碼是404之類的,fetch也是成功返回的,只有在網(wǎng)絡連接錯誤的情況下,才會reject
fetch不發(fā)送cookies

fetch的請求寫法會比AJAX簡單許多,但我想,最主要的問題是,無法區(qū)分HTTP狀態(tài)碼了,這個在編程時還是比較常用的,所以我們目前還是使用axios比較多,而很少使用fetch

實現(xiàn)

為什么?

我們現(xiàn)在都是單頁面應用,需要做并發(fā)限制文章來源地址http://www.zghlxwxcb.cn/news/detail-610527.html

串行和并行

  • 串行:請求是異步的,需要等待上一個請求成功,才能執(zhí)行下一個請求
  • 并行:同時發(fā)送多個請求「HTTP請求可以同時進行,但是JS的操作都是一步步的來的,因為JS是單線程」,等待所有請求都成功,我們再去做什么事情?

Promise.all并發(fā)限制及async-pool的應用

const delay = function delay(interval) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            // if (interval === 1003) reject('xxx');
            resolve(interval);
        }, interval);
    });
};
let tasks = [() => {
    return delay(1000);
}, () => {
    return delay(1003);
}, () => {
    return delay(1005);
}, () => {
    return delay(1002);
}, () => {
    return delay(1004);
}, () => {
    return delay(1006);
}];

/* Promise.all(tasks.map(task => task())).then(results => {
    console.log(results);
}); */

let results = [];
asyncPool(2, tasks, (task, next) => {
    task().then(result => {
        results.push(result);
        next(); //執(zhí)行下一個
    });
}, () => {
    console.log(results); //所有都完成
});

JS實現(xiàn)Ajax并發(fā)請求控制的兩大解決方案

// tasks:數(shù)組,數(shù)組包含很多方法,每一個方法執(zhí)行就是發(fā)送一個請求「基于Promise管理」
function createRequest(tasks, pool) {
    pool = pool || 5;
    let results = [],
        together = new Array(pool).fill(null),
        index = 0;
    together = together.map(() => {
        return new Promise((resolve, reject) => {
            const run = function run() {
                if (index >= tasks.length) {
                    resolve();
                    return;
                };
                let old_index = index,
                    task = tasks[index++];
                task().then(result => {
                    results[old_index] = result;
                    run();
                }).catch(reason => {
                    reject(reason);
                });
            };
            run();
        });
    });
    return Promise.all(together).then(() => results);

createRequest(tasks, 2).then(results => {
    // 都成功,整體才是成功,按順序存儲結(jié)果
    console.log('成功-->', results);
}).catch(reason => {
    // 只要有也給失敗,整體就是失敗
    console.log('失敗-->', reason);
}); 
} 
function createRequest(tasks, pool, callback) {
    if (typeof pool === "function") {
        callback = pool;
        pool = 5;
    }
    if (typeof pool !== "number") pool = 5;
    if (typeof callback !== "function") callback = function () {};
    //------
    class TaskQueue {
        running = 0;
        queue = [];
        results = [];
        pushTask(task) {
            let self = this;
            self.queue.push(task);
            self.next();
        }
        next() {
            let self = this;
            while (self.running < pool && self.queue.length) {
                self.running++;
                let task = self.queue.shift();
                task().then(result => {
                    self.results.push(result); // 沒有管控順序
                }).finally(() => {   // 失敗之后繼續(xù)
                    self.running--;
                    self.next();
                });
            }
            if (self.running === 0) callback(self.results);
        }
    }
    let TQ = new TaskQueue;
    tasks.forEach(task => TQ.pushTask(task));
}
createRequest(tasks, 2, results => {
    console.log(results);
});

到了這里,關(guān)于AJAX并發(fā)請求控制的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • JavaScript中最重要的一環(huán)之一,ajax發(fā)送請求??!

    如需向服務器發(fā)送請求,我們使用 XMLHttpRequest 對象的? open() ?和? send() ?方法: 方法 描述 open( method ,? url ,? async ) 規(guī)定請求的類型 method :請求的類型:GET 還是 POST url :服務器(文件)位置 async :true(異步)或 false(同步) send() 向服務器發(fā)送請求(用于 GET) send( stri

    2024年01月17日
    瀏覽(26)
  • 前端開發(fā)中的ajax請求、axios封裝

    前端開發(fā)中的ajax請求、axios封裝

    目錄 瀏覽器http請求 同步?js標簽跨域、url 異步ajax、websock協(xié)議 ajax是異步的技術(shù)術(shù)語,最早的api是xhr(XMLHttpRequest) fetch es6 api axios 封裝axios(無論用requst還是axios請求都會生效) src/utils/request.ts請求/響應攔截器封裝 ts post請求request.post(url)和 通用請求request({url,method:\\\'post\\\'})對象

    2024年02月11日
    瀏覽(69)
  • 前端架構(gòu)師之01_JavaScript_Ajax

    1.1 Web服務器 Web服務器又稱為網(wǎng)站服務器,主要用于提供網(wǎng)上信息瀏覽服務。 常見的Web服務器軟件有Apache HTTP Server(簡稱Apache)、Nginx等。 瀏覽器與服務器交互 在Web服務器中,請求資源又分為靜態(tài)資源和動態(tài)資源。 靜態(tài)資源的特點:只要服務器沒有修改這些文件,客戶端每

    2024年02月07日
    瀏覽(44)
  • 前端如何中斷請求 ( axios、原生 ajax、fetch)

    使用場景 在前端開發(fā)中,我們經(jīng)常需要中斷請求來優(yōu)化性能或處理特定的業(yè)務需求。以下是一些常見的使用場景: 比如 重復請求:當頁面中多個組件并發(fā)調(diào)用同一個接口時,在第一個請求返回后,我們可能需要中斷其他組件對該接口的調(diào)用,以避免重復請求和冗余數(shù)據(jù)。這

    2024年02月04日
    瀏覽(42)
  • 前端終止請求的三種方式(ajax、axios)

    前端終止請求的三種方式(ajax、axios)

    一、原生ajax終止請求 1、abort() ? XMLHttpRequest.abort() 方法用于終止 XMLHttpRequest 對象的請求,該方法沒有參數(shù),也沒有返回值。當調(diào)用該方法時,如果對應 XMLHttpRequest 對象的請求已經(jīng)被發(fā)送并且正在處理中,則會中止該請求;如果請求已經(jīng)完成(即已經(jīng)接收到完整的響應),則

    2024年02月09日
    瀏覽(28)
  • AJAX 使用 JavaScript 的 `XMLHttpRequest` 對象來向服務器發(fā)送異步請求

    AJAX 使用 JavaScript 的 `XMLHttpRequest` 對象來向服務器發(fā)送異步請求

    AJAX 是一種使用異步 HTTP (Ajax) 請求獲取和發(fā)送數(shù)據(jù)的技術(shù)。它使得網(wǎng)頁能夠進行異步更新,而不需要重新加載整個頁面。通過使用 AJAX,可以在不重新加載整個頁面的情況下,與服務器交換數(shù)據(jù)并更新部分網(wǎng)頁內(nèi)容。 AJAX 使用 JavaScript 的 XMLHttpRequest 對象來向服務器發(fā)送異步請

    2024年01月16日
    瀏覽(27)
  • 解決后端無法對前端的ajax請求重定向

    解決后端無法對前端的ajax請求重定向

    本章目錄: 問題描述 AJAX請求后端直接重定向失敗 解決方案 后端攔截請為響應頭添加 重定向標志 后端攔截器為響應頭添加 重定向路徑 前端響應攔截器獲取響應頭數(shù)據(jù),并通過location.href = url 完成頁面跳轉(zhuǎn) 本來想在攔截器里設(shè)置未登錄用戶訪問指定接口時,跳轉(zhuǎn)到登錄頁面

    2024年02月15日
    瀏覽(21)
  • 前端請求數(shù)據(jù)方法 —— Ajax、Fetch、Axios、Get、Post

    Ajax :( “Asynchronous JavaScript and XML”(異步JavaScript和XML)的縮寫)是一組Web開發(fā)技術(shù),Ajax不是一種技術(shù),而是一個編程概念。AJAX 這個詞就成為 JavaScript 腳本發(fā)起 HTTP 通信的代名詞,也就是說,只要用腳本發(fā)起通信,就可以叫做 AJAX 通信。 技術(shù)實現(xiàn) 用于演示的HTML(或 XHTML)和

    2024年01月22日
    瀏覽(28)
  • 前端學習記錄~2023.8.10~JavaScript重難點實例精講~第6章 Ajax

    前端學習記錄~2023.8.10~JavaScript重難點實例精講~第6章 Ajax

    本章是第六章Ajax相關(guān)的內(nèi)容。 Ajax是一種流行的前后端數(shù)據(jù)交互的方式,通過異步請求就可以在不需要刷新頁面的情況下,達到局部刷新的效果。 Ajax并非是一種全新的技術(shù),而是由以下技術(shù)組合而成: 使用CSS和XHTML做頁面呈現(xiàn) 使用DOM進行交互和動態(tài)顯示 使用XMLHttpRequest對象

    2024年02月11日
    瀏覽(57)
  • Java對接百度文心一言,Java發(fā)送POST請求,類似前端AJAX

    這是項目中使用的對接百度文心一言后端代碼

    2024年02月15日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包