场景:想请求量较大的网络数据,比如想获取1000条结果,但数据处理速度慢,有超时的风险,可以分成10次处理,每次处理100条;所有请求完成后再统一进行处理。

这样的应用场景,可以这样处理:

方案一:判断请求到的数据条目

// 模拟网络请求
function fetch(url, callback) {setTimeout(function (){callback(null, {subjects: [{data: Math.round(Math.random() * 100)}]});}, 2000);
}// 实现方案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);// 调用完成后统一处理if (arr.length === 10) {console.log(arr);}});}
}

将运行结果用arr.length来判断,如果arr.length不像我们期望的那样,比如由于网络传输或者处理异常,少一条,那么我们将无法做后续的处理。这种处理方式强业务耦合;不具有普适性。

方案二:判断异步过程执行次数

// 方案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 充当异步任务执行情况的观察员,
仅与异步过程的调用次数有关,且与其他处理过程无关。那有没有其他方案呢

方案三: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);});
}

这种方式更具有通用性,如果异步任务类型不同,也可以用这种方式来解决。不过应当注意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基于事件订阅/发布模式,这里的after 方法可以侦听多次事件,回调中保存了多次异步任务的数据结果的数组;除此之外EventProxy还支持多个不同事件的侦听和处理。

node.js 多个异步过程判断执行是否完成相关推荐

  1. 17.Node.js 回调函数--异步编程

    转自:http://www.runoob.com/nodejs/nodejs-tutorial.html Node.js 异步编程的直接体现就是回调. 异步编程依托于回调来实现,但不能说使用了回调后程 ...

  2. 学习Node.js并开始在浏览器之外执行JavaScript

    Learn about the Node.js JavaScript runtime environment in this full course from Samer Buna. Node.js ...

  3. Node.js中的异步编程,个人理解及分化讲解

    Nodejs Nodejs本身是单线程的,底层核心库是Google开发的V8引擎,而主要负责实现Nodejs的异步功能的是一个叫做libuv的开源库,github上可以找到它. 异步编程 Nodejs ...

  4. JS定时器同步异步问题(顺序执行)

    定时器同步问题 场景 1.异步代码 代码如下(示例): console.log('1')setTimeout(() => {console.log('2')}, 1500);console.lo ...

  5. windows node.js安装以及启动过程

    npm install -g cnpm --registry=https://registry.npm.taobao.org cnpm install node-sass cnpm install 启 ...

  6. [Node] Node.js Webpack和打包过程

  7. Node.js 异步编程(附几个小练习题学会分析代码执行顺序)

    1. 同步API,异步API 同步API:只有当前API执行完成后,才能继续执行下一个API console.log('before'); console.log('after'); 异步API:当前 ...

  8. js 延迟几秒执行_深入研究 Node.js 的回调队列

    队列是 Node.js 中用于有效处理异步操作的一项重要技术. 在本文中,我们将深入研究 Node.js 中的队列:它们是什么,它们如何工作(通过事件循环)以及它们的类型. Node.js 中的队列是 ...

  9. Node.js文件的同步异步事件循环

    刚接触Node.js关于同步异步,事件循环的笔记: 1,文件同异步 var fs = require('fs'); fs.readFile('file.txt', 'utf-8', function( ...

最新文章

  1. Confluence 6 配置日志
  2. 统计与分布之高斯分布
  3. (*长期更新)软考网络工程师学习笔记——Section 3 宽带接入技术和导引型传输媒体
  4. 得到application server上所有的logon user
  5. python是一门高级的计算机语言对吗_Python是一门怎样的编程语言
  6. find VS not looking for VS2015
  7. Windows破解笔记-windows API中的SendMessage
  8. 请求网页时,怎么给我返回了一段 JavaScript 代码
  9. 工信部:三大运营商移动电话用户总数达15.92亿户 同比增长0.2%
  10. 【零基础入门】 css学习笔记(5) 浮动
  11. 第一篇:微信公众平台开发实战Java版之了解微信公众平台基础知识以及资料准备...
  12. 比ping更强大的fping
  13. Mysql5.7安装超详细教学
  14. 清明时节,思念友人张锦文
  15. tf 设置多显卡_让显卡再次危机,《孤岛危机》重置版能否找回当年的感动
  16. VSC# ArcGIS 二次开发--出图工具:添加图名、比例尺、指北针、图例,导出图片或文件、打印地图
  17. 上班族妈妈的教子宝典:教你做事业成功的好妈妈
  18. 永动机:空想与诈骗——收集一些趣味的永动机设计
  19. CSS实现表格细边框的三种方式
  20. BGP 基础与概述-2

热门文章

  1. 那些逃离互联网大厂的年轻人
  2. 腾讯云智能制造首次披露三大战略布局,发布“511”生态伙伴计划
  3. Android上传队列使用
  4. vlmcsd 编译与测试
  5. TCP端口状态说明ESTABLISHED、TIME_WAIT、 CLOSE_WAIT
  6. 厦门试点医疗大数据 产值有望达1200亿
  7. Spring Boot——2分钟构建springweb mvc REST风格HelloWorld
  8. 常见的shell实例
  9. Apache Shiro 使用手册
  10. Spring @SessionAttributes @ModelAttribute