欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

node.js多個(gè)異步過程中判斷執(zhí)行是否完成的解決方案

 更新時(shí)間:2017年12月10日 14:28:21   作者:will233  
這篇文章主要給大家介紹了關(guān)于node.js多個(gè)異步過程中判斷執(zhí)行是否完成的幾種解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。

前言

本文主要給大家介紹了關(guān)于node.js多個(gè)異步過程中判斷執(zhí)行是否完成的相關(guān)內(nèi)容,可能這樣說大家不是很明白,下面來一起看看詳細(xì)的介紹吧。

場(chǎng)景:

想請(qǐng)求量較大的網(wǎng)絡(luò)數(shù)據(jù),比如想獲取1000條結(jié)果,但數(shù)據(jù)處理速度慢,有超時(shí)的風(fēng)險(xiǎn),可以分成10次處理,每次處理100條;所有請(qǐng)求完成后再統(tǒng)一進(jìn)行處理。

這樣的應(yīng)用場(chǎng)景,可以這樣處理:

方案一:判斷請(qǐng)求到的數(shù)據(jù)條目

// 模擬網(wǎng)絡(luò)請(qǐng)求
function fetch(url, callback) {
 setTimeout(function (){
 callback(null, {
  subjects: [{
   data: Math.round(Math.random() * 100)
  }]
  });
 }, 2000);
}
// 實(shí)現(xiàn)方案1
function multiTask_1 () {
 var arr = [];
 var baseUrl = 'https://api.douban.com/v2/movie/top250';
 for (var start = 0; start < 10; start++) {
 var url = baseUrl + '?start=' + start + "&count=1";
  fetch(url, function(error, res) {
  var data = res.subjects;
  arr = arr.concat(data);
  // 調(diào)用完成后統(tǒng)一處理
  if (arr.length === 10) {
   console.log(arr);
  }
 });
 }
}

將運(yùn)行結(jié)果用arr.length來判斷,如果arr.length不像我們期望的那樣,比如由于網(wǎng)絡(luò)傳輸或者處理異常,少一條,那么我們將無法做后續(xù)的處理。這種處理方式強(qiáng)業(yè)務(wù)耦合;不具有普適性。

方案二:判斷異步過程執(zhí)行次數(shù)

// 方案2
function multiTask_2 () {
 var taskWatcher = 0;
 var arr = [];
 var baseUrl = 'https://api.douban.com/v2/movie/top250';
 for (var start = 0; start < 10; start++) {
 taskWatcher++;
 var url = baseUrl + '?start=' + start + "&count=1";
 fetch(url, function(error, res) {
  var data = res.subjects;
  arr = arr.concat(data);
  taskWatcher--;
  if (taskWatcher === 0) {
   console.log(arr);
  }
 });
 }
}

方案2 的判斷條件,這里的 taskWatcher 充當(dāng)異步任務(wù)執(zhí)行情況的觀察員,僅與異步過程的調(diào)用次數(shù)有關(guān),且與其他處理過程無關(guān)。那有沒有其他方案呢

方案三:Promise.all()

Promise.all(iterable) 方法返回一個(gè) Promise, 它將在上述可迭代對(duì)象中的所有 Promise 被 resolve 之后被 resolve,或者在任一 Promise 被 reject 后被 reject。

function multiTask_3 () {
 // var taskWatcher = 0;
 var taskStack = [];
 var arr = [];
 var baseUrl = 'https://api.douban.com/v2/movie/top250';
 for (var start = 0; start < 10; start++) {
 taskStack.push(
  new Promise((resolve, reject) => {
  var url = baseUrl + '?start=' + start + "&count=1";
  fetch(url, function(error, res) {
   var data = res.subjects;
   arr = arr.concat(data);
   resolve();
  });
  })
 );
 }
 Promise.all(taskStack).then(function () {
 console.log(arr);
 });
}

這種方式更具有通用性,如果異步任務(wù)類型不同,也可以用這種方式來解決。不過應(yīng)當(dāng)注意reject的處理。避免其對(duì)最終處理的影響。

方案四: EventProxy

EventProxy是樸靈寫的,https://github.com/JacksonTian/eventproxy

 var ep = new EventProxy();
 var arr = [];
 ep.after('fetchData', 10, function (list) {
 list.forEach(function(item){
  arr = arr.concat(item); 
 });
 console.log(arr);
 });
 var baseUrl = 'https://api.douban.com/v2/movie/top250';
 for (var start = 0; start < 10; start++) {
 var url = baseUrl + '?start=' + start + "&count=1";
  fetch(url, function(error, res) {
  var data = res.subjects;
  ep.emit('fetchData', data);
 });
 }

EventProxy基于事件訂閱/發(fā)布模式,這里的after 方法可以偵聽多次事件,回調(diào)中保存了多次異步任務(wù)的數(shù)據(jù)結(jié)果的數(shù)組;除此之外EventProxy還支持多個(gè)不同事件的偵聽和處理。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Node.js實(shí)用代碼段之正確拼接Buffer

    Node.js實(shí)用代碼段之正確拼接Buffer

    這篇文章主要介紹了Node.js實(shí)用代碼段之正確拼接Buffer,通過實(shí)例代碼分享如何正確拼接Buffer,感興趣的小伙伴們可以參考一下
    2016-03-03
  • 基于nodejs的微信JS-SDK簡單應(yīng)用實(shí)現(xiàn)

    基于nodejs的微信JS-SDK簡單應(yīng)用實(shí)現(xiàn)

    這篇文章主要介紹了基于nodejs的微信JS-SDK簡單應(yīng)用實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-05-05
  • 初探nodeJS

    初探nodeJS

    本文主要介紹了nodeJS的基礎(chǔ)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • Node.js使用Express創(chuàng)建Web項(xiàng)目詳細(xì)教程

    Node.js使用Express創(chuàng)建Web項(xiàng)目詳細(xì)教程

    如果需要入門使用node.js進(jìn)行web開發(fā),正在學(xué)習(xí) nodejs web開發(fā)指南 的和想快速了解node.js web開發(fā)模式的朋友,相信本文是有一定幫助意義的。
    2017-03-03
  • Node.js 異步異常的處理與domain模塊解析

    Node.js 異步異常的處理與domain模塊解析

    本篇文章主要介紹了Node.js 異步異常的處理與domain模塊解析,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • node.js 使用ejs模板引擎時(shí)后綴換成.html

    node.js 使用ejs模板引擎時(shí)后綴換成.html

    本文給大家分享一個(gè)nodejs的小技巧,將ejs模板引擎的模板后綴改成.html的使用方法,非常的簡單實(shí)用,這里推薦給大家。
    2015-04-04
  • 如何從頭實(shí)現(xiàn)一個(gè)node.js的koa框架

    如何從頭實(shí)現(xiàn)一個(gè)node.js的koa框架

    這篇文章主要介紹了如何從頭實(shí)現(xiàn)一個(gè)node.js的koa框架,koa.js是最流行的node.js后端框架之一,有很多網(wǎng)站都使用koa進(jìn)行開發(fā),同時(shí)社區(qū)也涌現(xiàn)出了一大批基于koa封裝的企業(yè)級(jí)框架。,需要的朋友可以參考下
    2019-06-06
  • npm安裝淘寶鏡像報(bào)錯(cuò)問題解決(npm install -g cnpm)

    npm安裝淘寶鏡像報(bào)錯(cuò)問題解決(npm install -g cnpm)

    本文主要介紹了npm安裝淘寶鏡像報(bào)錯(cuò)問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • 使用nodejs搭建微信小程序支付接口的詳細(xì)過程

    使用nodejs搭建微信小程序支付接口的詳細(xì)過程

    前段時(shí)間做微信支付,遇到了很多坑,網(wǎng)上也沒有講解的特別明白的,通過借鑒各路人才的經(jīng)驗(yàn),最后也完成了,下面這篇文章主要給大家介紹了關(guān)于使用nodejs搭建微信小程序支付接口的詳細(xì)過程,需要的朋友可以參考下
    2022-12-12
  • 一些可能會(huì)用到的Node.js面試題

    一些可能會(huì)用到的Node.js面試題

    這篇文章主要介紹了一些可能會(huì)用到的Node.js面試題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2019-06-06

最新評(píng)論