最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript使用Promise控制并發(fā)請求

 更新時間:2023年06月26日 11:29:51   作者:前端技術(shù)棧  
當(dāng)我們需要同時處理多個請求時,如何避免請求之間的沖突和混亂呢,這就是今天我們要探討的話題——如何使用Promise控制并發(fā)請求,感興趣的可以了解一下

開篇

在現(xiàn)代Web開發(fā)中,異步請求已經(jīng)成為了必不可少的一部分。然而,當(dāng)我們需要同時處理多個請求時,如何避免請求之間的沖突和混亂呢?這就是今天我們要探討的話題——如何使用Promise控制并發(fā)請求。

在JavaScript中可以通過Promise.all()、Promise.race()、async/await等不同方式來實現(xiàn)對異步并發(fā)任務(wù)的控制。以下是一種使用Promise.all()方法實現(xiàn)并發(fā)控制的示例:

Promise.all()

const urls = ["url1", "url2", ... ,"url100"]; 
const maxConcurrentNum = 10; // 最大并發(fā)數(shù) 
// 數(shù)組分塊,chunk表示每批次數(shù)量,返回數(shù)組二維數(shù)組 
function chunk(arr, chunk) { 
  let result = []; 
  for (let i = 0, len = arr.length; i < len; i += chunk) { 
    result.push(arr.slice(i, i + chunk)); 
   } 
   return result; 
 }
// 異步請求方法 
function fetchUrl(url) { 
  return new Promise((resolve, reject) => { 
    fetch(url) 
      .then(res => resolve(res)) 
      .catch(err => reject(err)); 
     }); 
   }
// 對url數(shù)組進行分塊處理
const chunkedUrls = chunk(urls, maxConcurrentNum);
(async function () {
  try {
    for (let urls of chunkedUrls) {
      const promises = urls.map(url => fetchUrl(url));
      // 等待所有promises完成執(zhí)行,并將結(jié)果存入results數(shù)組中
      const results = await Promise.all(promises);
      console.log('results:', results);
    }
  } catch (err) {
   console.error(err);
  }
})();

以上代碼通過將數(shù)組分成多個數(shù)目相等的小數(shù)組,每次最多只開啟maxConcurrentNum個并發(fā)請求,以此來控制并發(fā)數(shù)量。每當(dāng)一組請求完成后再發(fā)送新的一批請求,可以實現(xiàn)對異步任務(wù)的并發(fā)控制。

Promise.race()

以下是使用Promise.race()方法來控制并發(fā)的示例代碼:

const promiselist = [];
for (let i = 0; i < 100; i++) {
  const promise = fetch(`https://example.com/data${i}.json`);
  promiselist.push(promise);
}
Promise.race(promiselist)
  .then(response => {
    // handle the fastest response here
  })
  .catch(error => {
    console.error(error);
  });

async/await

以下是使用async/await方式控制并發(fā)請求的示例代碼:

async function getData() {
  const promiselist = [];
  for (let i = 0; i < 100; i++) {
    const promise = fetch(`https://example.com/data${i}.json`);
    promiselist.push(promise);
  }
  const responses = await Promise.all(promiselist);
  for (const response of responses) {
    // handle each response here 
  }
}
getData().catch(error => {
  console.error(error);
});

在上面的代碼中,我們首先創(chuàng)建了一個async函數(shù),并在該函數(shù)中使用for循環(huán)來發(fā)送所有的請求,并將每個請求的Promise對象存儲在一個數(shù)組中。 然后,我們使用await關(guān)鍵字來異步等待所有Promise對象都被解決,并將解決值存儲在一個數(shù)組中。 最后,我們在處理每個響應(yīng)時對數(shù)組進行迭代。

如果我們只需要等待最快的請求,我們可以使用Promise.race()方法,并將其包裝在一個async函數(shù)中。 這種方法與使用Promise.all()的方式相似,只需使用不同的Promise方法即可。

以下是使用async/await方式控制并發(fā)請求的示例代碼,其中使用Promise.race()方法:

async function getData() {
  const promiselist = [];
  for (let i = 0; i < 100; i++) {
    const promise = fetch(`https://example.com/data${i}.json`);
    promiselist.push(promise);
  }
  const response = await Promise.race(promiselist);
  // handle the fastest response here
}
getData().catch(error => {
  console.error(error);
});

在上述代碼中,我們使用async函數(shù)來生成Promise對象,然后使用Promise.race()方法等待最快的解決Promise對象,并處理其解決值。

除了Promise.all()和Promise.race()以及async/await等方法外,還有其他用于控制并發(fā)請求的可行方法,例如:

手動控制計數(shù)器

可以使用變量來手動計數(shù),以控制請求并發(fā)數(shù)。例如,在循環(huán)中,當(dāng)計數(shù)器達到最大并發(fā)請求數(shù)時,將其用于等待請求完成,然后遞增計數(shù)器以允許下一個請求。
以下是手動控制計數(shù)器的示例代碼:

function getData() {
 const limit = 5; // maximum concurrent requests
 const dataUrls = ['https://example.com/data1.json', 
                   'https://example.com/data2.json',
                   'https://example.com/data3.json',
                   'https://example.com/data4.json',
                   'https://example.com/data5.json',
                   'https://example.com/data6.json'];
 let counter = 0;
 const getDataPromise = dataUrl => {
   return new Promise((resolve, reject) => {
     fetch(dataUrl)
       .then(response => {
         counter--;
         resolve(response);
       })
       .catch(error => {
         counter--;
         reject(error);
       });
   });
 };
 const getDataPromises = dataUrls.map(dataUrl => {
   if (counter < limit) {
     counter++;
     return getDataPromise(dataUrl);
   } else {
     return new Promise(resolve => {
       const interval = setInterval(() => {
         if (counter < limit) {
           counter++;
           clearInterval(interval);
           resolve(getDataPromise(dataUrl));
         }
       }, 100);
     });
   }
 });
 Promise.all(getDataPromises)
   .then(responses => {
     for (const response of responses) {
       // handle each response here
     }
   })
   .catch(error => {
     console.error(error);
   });
}
getData();

在上面的代碼中,我們手動地使用計數(shù)器來控制最大并發(fā)請求數(shù),然后使用setInterval函數(shù)來等待可用的請求槽位。

使用第三方庫

此外,還有一些第三方庫可以使用,例如async.js和p-limit等。p-limit是一個專門用于控制Promise并發(fā)的小型庫??梢栽趐-limit文檔中找到更多信息和示例。

總結(jié)

通過掌握Promise的使用,我們可以輕松應(yīng)對并發(fā)請求,讓我們的Web應(yīng)用更加流暢,用戶更加滿意。所以,別讓并發(fā)請求成為你的噩夢,讓Promise來幫你解決吧!

到此這篇關(guān)于JavaScript使用Promise控制并發(fā)請求的文章就介紹到這了,更多相關(guān)Promise控制并發(fā)請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文帶你搞懂面試率超高的JS事件循環(huán)

    一文帶你搞懂面試率超高的JS事件循環(huán)

    事件循環(huán)是?JavaScript?中一個非常重要的概念,下面就來看看瀏覽器和?Node.js?中的事件循環(huán)的原理,以及兩者之間的差異,感興趣的可以了解一下
    2022-10-10
  • js微信支付實現(xiàn)代碼

    js微信支付實現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了javascript微信支付的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • JS 樹形遞歸實例代碼

    JS 樹形遞歸實例代碼

    下面的代碼是從實際項目中AJAX的回調(diào)部分 copy 出來的,使用了JS的遞歸,文本格式為JSON
    2010-05-05
  • JS打印組合功能

    JS打印組合功能

    這篇文章主要介紹了JS打印組合功能,包括JS實現(xiàn)簡單的頁面局部打印,感興趣的小伙伴們可以參考一下
    2016-08-08
  • 使用ECharts進行數(shù)據(jù)可視化的代碼詳解

    使用ECharts進行數(shù)據(jù)可視化的代碼詳解

    ECharts 是一個由百度開源的強大、靈活的 JavaScript 圖表庫,用于在 Web 頁面上創(chuàng)建各種類型的數(shù)據(jù)可視化圖表,它具有豐富的圖表類型、強大的配置選項和良好的跨平臺兼容性,本文介紹了如何使用ECharts進行數(shù)據(jù)可視化,需要的朋友可以參考下
    2024-08-08
  • javascript 客戶端驗證上傳圖片的大小(兼容IE和火狐)

    javascript 客戶端驗證上傳圖片的大?。嫒軮E和火狐)

    做web開發(fā)的哥們都會遇到批量上傳圖片的需求,相信大家都會遇到這樣的問題,當(dāng)選擇好要上傳的圖片,提交服務(wù)器后,發(fā)現(xiàn)有圖片的大小超過了系統(tǒng)允許的范圍。
    2009-08-08
  • 輕松掌握J(rèn)avaScript策略模式

    輕松掌握J(rèn)avaScript策略模式

    這篇文章主要幫助大家輕松掌握J(rèn)avaScript策略模式,什么是js策略模式,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Dropify.js圖片寬高自適應(yīng)的方法

    Dropify.js圖片寬高自適應(yīng)的方法

    本篇文章主要介紹了Dropify.js圖片寬高自適應(yīng)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • JavaScript中document.querySelector函數(shù)用法介紹

    JavaScript中document.querySelector函數(shù)用法介紹

    這篇文章主要給大家介紹了關(guān)于JavaScript中document.querySelector函數(shù)用法的相關(guān)資料,document.querySelector是JavaScript中的一個內(nèi)置方法,用于通過CSS選擇器選擇文檔中的第一個匹配元素,需要的朋友可以參考下
    2023-08-08
  • Bootstrap Scrollspy源碼學(xué)習(xí)

    Bootstrap Scrollspy源碼學(xué)習(xí)

    這篇文章主要介紹了Bootstrap Scrollspy源碼學(xué)習(xí),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03

最新評論

万源市| 始兴县| 九龙县| 嘉义市| 隆子县| 东乌| 开远市| 东乌珠穆沁旗| 太仆寺旗| 罗定市| 巴中市| 神农架林区| 清丰县| 工布江达县| 隆昌县| 阿拉善盟| 三河市| 西乌珠穆沁旗| 贵阳市| 岑溪市| 蒙山县| 来凤县| 许昌市| 闽侯县| 黄山市| 和硕县| 巴中市| 施甸县| 东光县| 福海县| 洛南县| 平罗县| 板桥市| 南澳县| 盖州市| 泗阳县| 湖北省| 英吉沙县| 巧家县| 台湾省| 巴林右旗|