国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

node.js 多個異步過程判斷執(zhí)行是否完成

cyrils / 2213人閱讀

摘要:方案二判斷異步過程執(zhí)行次數(shù)方案方案的判斷條件,這里的充當異步任務(wù)執(zhí)行情況的觀察員,僅與異步過程的調(diào)用次數(shù)有關(guān),且與其他處理過程無關(guān)。不過應(yīng)當注意的處理。避免其對最終處理的影響。

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

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

方案一:判斷請求到的數(shù)據(jù)條目
// 模擬網(wǎng)絡(luò)請求
function fetch(url, callback) {
  setTimeout(function (){
    callback(null, {
        subjects: [{
          data: Math.round(Math.random() * 100)
        }]
      });
  }, 2000);
}

// 實現(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);
        }
    });
  }
}

將運行結(jié)果用arr.length來判斷,如果arr.length不像我們期望的那樣,比如由于網(wǎng)絡(luò)傳輸或者處理異常,少一條,那么我們將無法做后續(xù)的處理。這種處理方式強業(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 充當異步任務(wù)執(zhí)行情況的觀察員,
僅與異步過程的調(diào)用次數(shù)有關(guān),且與其他處理過程無關(guān)。那有沒有其他方案呢

方案三:Promise.all()

Promise.all(iterable) 方法返回一個 Promise, 它將在上述可迭代對象中的所有 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)當注意reject的處理。避免其對最終處理的影響。

方案四: 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還支持多個不同事件的偵聽和處理。

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/90324.html

相關(guān)文章

  • Node_深入淺出Node

    摘要:簡介項目命名為就是一個服務(wù)器單純開發(fā)一個服務(wù)器的想法,變成構(gòu)建網(wǎng)絡(luò)應(yīng)用的一個基本框架發(fā)展為一個強制不共享任何資源的單線程,單進程系統(tǒng)。單線程弱點無法利用多核錯誤會引起整個應(yīng)用退出,應(yīng)用的健壯性大量計算占用導(dǎo)致無法繼續(xù)調(diào)用異步。 NodeJs簡介 Ryan Dahl項目命名為:web.js 就是一個Web服務(wù)器.單純開發(fā)一個Web服務(wù)器的想法,變成構(gòu)建網(wǎng)絡(luò)應(yīng)用的一個基本框架.Node發(fā)展...

    shinezejian 評論0 收藏0
  • 瀏覽器與Node的事件循環(huán)(Event Loop)有何區(qū)別?

    摘要:事件觸發(fā)線程主要負責(zé)將準備好的事件交給引擎線程執(zhí)行。它將不同的任務(wù)分配給不同的線程,形成一個事件循環(huán),以異步的方式將任務(wù)的執(zhí)行結(jié)果返回給引擎。 Fundebug經(jīng)作者浪里行舟授權(quán)首發(fā),未經(jīng)同意請勿轉(zhuǎn)載。 前言 本文我們將會介紹 JS 實現(xiàn)異步的原理,并且了解了在瀏覽器和 Node 中 Event Loop 其實是不相同的。 一、線程與進程 1. 概念 我們經(jīng)常說 JS 是單線程執(zhí)行的,...

    TANKING 評論0 收藏0
  • Node.js 異步異聞錄

    摘要:的異步完成整個異步環(huán)節(jié)的有事件循環(huán)觀察者請求對象以及線程池。執(zhí)行回調(diào)組裝好請求對象送入線程池等待執(zhí)行,實際上是完成了異步的第一部分,回調(diào)通知是第二部分。異步編程是首個將異步大規(guī)模帶到應(yīng)用層面的平臺。 showImg(https://segmentfault.com/img/remote/1460000011303472); 本文首發(fā)在個人博客:http://muyunyun.cn/po...

    zzbo 評論0 收藏0
  • Nodejs高性能原理(上) --- 異步非阻塞事件驅(qū)動模型

    摘要:使用了一個事件驅(qū)動非阻塞式的模型,使其輕量又高效。的包管理器,是全球最大的開源庫生態(tài)系統(tǒng)。按照這個定義,之前所述的阻塞,非阻塞,多路復(fù)用信號驅(qū)動都屬于同步。 系列文章 Nodejs高性能原理(上) --- 異步非阻塞事件驅(qū)動模型Nodejs高性能原理(下) --- 事件循環(huán)詳解 前言 終于開始我nodejs的博客生涯了,先從基本的原理講起.以前寫過一篇瀏覽器執(zhí)行機制的文章,和nodej...

    yy736044583 評論0 收藏0
  • webpack原理

    摘要:原理查看所有文檔頁面前端開發(fā)文檔,獲取更多信息。初始化階段事件名解釋初始化參數(shù)從配置文件和語句中讀取與合并參數(shù),得出最終的參數(shù)。以上處理的相關(guān)配置如下編寫編寫的職責(zé)由上面的例子可以看出一個的職責(zé)是單一的,只需要完成一種轉(zhuǎn)換。 webpack原理 查看所有文檔頁面:前端開發(fā)文檔,獲取更多信息。原文鏈接:webpack原理,原文廣告模態(tài)框遮擋,閱讀體驗不好,所以整理成本文,方便查找。 工作...

    trigkit4 評論0 收藏0

發(fā)表評論

0條評論

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