一般而言,事件与侦听器的关系是一对多,但在异步编程中,也会出现事件与侦听器的关系是多对 一的情况,也就是说一个业务逻辑可能依赖两个通过回调或事件传递。

AOP 模式

lodash 就有 after,在多少次后执行,私有化预制了 timers 变量。

function after (timers, callback) {return function (params) {if (--timers === 0) {callback()}}
}let newFn = after(2, function () {console.log('after')
})newFn()
newFn()

以文件读取为例:

function after (timers, fn) {let arr = [];return function (data) { //  每次都会触发这个函数arr.push(data)if (--times === 0) { // 达到目的就触发fn(arr)}}
}let out = after(2, function (data) {// 执行完成的回调console.log(data)
})// 异步都有一个回调
fs.readFile('./a.txt', 'utf8', function (err, data) {console.log(data)out(data)
})
fs.readFile('./b.txt', 'utf8', function (err, data) {console.log(data)out(data)
})

发布订阅模式

function Events () {this.arr = []
}Events.prototype.on = function (fn) {// 订阅this.arr.push(fn)
}Events.prototype.emit = function (params) {this.arr.forEach(function (fn) {fn(params)})
}// 多个异步并发靠的都是计数器
let e = new Events();
let arr = []
e.on(function (r) {if (arr.length === 2) {// 执行完成的回调console.log('ok')}
})// 异步都有一个回调
fs.readFile('./a.txt', 'utf8', function (err, data) {console.log(data)e.emit(data)
})
fs.readFile('./b.txt', 'utf8', function (err, data) {console.log(data)e.emit(data)
})

Promise/Deferred 模式

let fs = require('fs');// 实现promise延迟对象,defer
Promise.defer = function () {let dfd = {};dfd.promise = new Promise((resolve, reject) => {dfd.resolve = resolve;dfd.reject = reject;})return dfd
}// function read () {
//   return new Promise((resolve, reject) => {
//     fs.readFile('./a.txt', 'utf8', (err, data) => {
//       if (!err) resolve(data)
//     })
//   })
// }
// 减少代码嵌套,function read () {let defer = Promise.defer()fs.readFile('./a.txt', 'utf8', (err, data) => {if (!err) defer.resolve(data)})return defer.promise
}read().then((data) => {console.log(data)
})

promise 化,将一个方法 promise 化,node 有个库, bluebird。

const fs = require('fs')
let bluebird = require('bluebird')let read = bluebird.promisify(fs.readFile)Promise.all([read('./a.txt'), read('./b.txt')]).then(data => {console.log(data)
})function promisify (fn) {return function (...args) {return new Promise((resolve, reject) => {fn(...args, function (err, data) {if (!err) resolve(data)})})}
}

多个异步之间的协作方案相关推荐

  1. node.js 多异步之间的协作方案

    <深入浅出node.js> P77 学习 ///用于处理多个事件对应一个侦听器的情况var count = 0; var results = {}; var done = function ...

  2. 浅谈Oracle 数据库之间数据同步方案

    随着信息技术的飞速发展,企业信息化建设的不断深入,使得企业业务系统数量不断增加.这时,各业务系统之间数据交互,各子业务系统与核心业务系统之间数据交互,诸如此类场景的应用需求不断出现.因此,IT部门应对 ...

  3. httpservlet.java:131_Servlet学习1:Http状态码、多个Servlet之间调用规则、多个Servlet之间数据共享实现方案...

    Http状态码 1.介绍: 1)由三位数字组成的一个符号. 2)Http服务器在推送响应包之前,根据本次请求处理情况将Http状态码写入到响应包中[状态行]上 3)如果Http服务器针对本次请求,返回 ...

  4. 线程的状态转换、sleep()、wait()、yeild()、终止线程的方法、线程之间的协作(join()、wait() notify() notifyAll()、await() signal() )

    1.线程的状态转换 1.1 新建(New) 创建后尚未启动 1.2 可运行(Runnable) 可能正在运行,也可能正在等待 CPU 时间片. 包含了操作系统线程状态中的 Running 和 Read ...

  5. Java协作开发,Java开发学习笔记之八:servlet之间的协作

    servlet与servlet,servlet与JSP(其本质也是servlet)之间需要合作.主要因为以下几个原因: 1.当Web程序比较复杂时,使用一个servlet来完成所有的功能显然是不合理的 ...

  6. [UE4]多个Montage之间存在协作问题

    Paragon 的连招系统的基础变量: bool comboflag bool isattacking int attackPeriod 玩家按下攻击键,检测 isattacking 如果 isatt ...

  7. 请给出异步加载js方案

    请给出异步加载js方案,不少于两种 默认情况javascript是同步加载的,也就是javascript的加载时阻塞的,后面的元素要等待javascript加载完毕后才能进行再加载,对于一些意义不是很 ...

  8. V2X、OBU、RSU、V2V之间的协作关系

    [自动驾驶]1.V2X.OBU.RSU.V2V之间的协作关系_Mister Zhu的博客-CSDN博客_obu和rsu 1. V2X.OBU.RSU.V2V 名词术语解释 OBU: On Board ...

  9. 【自动驾驶】1.V2X、OBU、RSU、V2V之间的协作关系

    1. V2X.OBU.RSU.V2V 名词术语解释 OBU: On Board Unit 车载单元 RSU: Road Side Unit 路侧单元 V2V: Vehicle to Vehicle 车 ...

最新文章

  1. RecyclerView Adapter中notifyDataSetChanged 的作用
  2. markdown自动生成侧边栏TOC /目录
  3. python适合做后端开发吗-转行IT做后端开发,学python还是java?
  4. [codevs 2926] 黑白瓷砖(2002年安徽省队选拔赛)
  5. 关于报错stale element reference: element is not attach
  6. frida hook java层常用模板
  7. python textwrap_python2.7.3编译python模块学习- textwrap 文本包装和填充
  8. 《DSP using MATLAB 》示例Example6.3
  9. Matrix响应式软件应用类型博客模板
  10. win8超极本盘符误删找回数据的办法
  11. Idea在plugin的marketplace中一直查不到东西安装插件
  12. 高性能mysql 小查询_高性能MySQL06-查询优化(慢查询)
  13. 写科研论文的高级方法学
  14. 手撸反向传播算法(附代码)
  15. 网络QoS原理与实现
  16. 每个项目都不同:支持一个摄像头,到现在还没搞好
  17. 优化模型之指派问题(整数规划)
  18. 英文原版jdk 1.8 API文档
  19. 写给青春,写给军乐团
  20. 加解密篇 - 什么是加密加盐 (分析web3j的加盐处理)

热门文章

  1. 物联网设备数量激增,续航难题该如何解决?
  2. CSDN送你互联网大厂面试机会啦!
  3. 第二十二届中国科协年会开幕,百度CTO王海峰等共话产业发展机遇
  4. Google X 新项目,用计算机视觉养鱼?
  5. 程序员必须掌握的 CPU 硬核干货!
  6. 倪光南:中国 5G 有望成为世界第一
  7. 天猫回应“双11数据造假”:已启动司法流程;小米折叠手机专利曝光;ASP.NET感染勒索软件|极客头条...
  8. 英特尔“宠坏”程序员!
  9. Python 爬取知乎 9674 个问答,揭秘最受欢迎的 98 本书!
  10. 谷歌最新开源的工具可以自动化查找并修复 bug!