多个异步之间的协作方案
一般而言,事件与侦听器的关系是一对多,但在异步编程中,也会出现事件与侦听器的关系是多对 一的情况,也就是说一个业务逻辑可能依赖两个通过回调或事件传递。
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)})})}
}
多个异步之间的协作方案相关推荐
- node.js 多异步之间的协作方案
<深入浅出node.js> P77 学习 ///用于处理多个事件对应一个侦听器的情况var count = 0; var results = {}; var done = function ...
- 浅谈Oracle 数据库之间数据同步方案
随着信息技术的飞速发展,企业信息化建设的不断深入,使得企业业务系统数量不断增加.这时,各业务系统之间数据交互,各子业务系统与核心业务系统之间数据交互,诸如此类场景的应用需求不断出现.因此,IT部门应对 ...
- httpservlet.java:131_Servlet学习1:Http状态码、多个Servlet之间调用规则、多个Servlet之间数据共享实现方案...
Http状态码 1.介绍: 1)由三位数字组成的一个符号. 2)Http服务器在推送响应包之前,根据本次请求处理情况将Http状态码写入到响应包中[状态行]上 3)如果Http服务器针对本次请求,返回 ...
- 线程的状态转换、sleep()、wait()、yeild()、终止线程的方法、线程之间的协作(join()、wait() notify() notifyAll()、await() signal() )
1.线程的状态转换 1.1 新建(New) 创建后尚未启动 1.2 可运行(Runnable) 可能正在运行,也可能正在等待 CPU 时间片. 包含了操作系统线程状态中的 Running 和 Read ...
- Java协作开发,Java开发学习笔记之八:servlet之间的协作
servlet与servlet,servlet与JSP(其本质也是servlet)之间需要合作.主要因为以下几个原因: 1.当Web程序比较复杂时,使用一个servlet来完成所有的功能显然是不合理的 ...
- [UE4]多个Montage之间存在协作问题
Paragon 的连招系统的基础变量: bool comboflag bool isattacking int attackPeriod 玩家按下攻击键,检测 isattacking 如果 isatt ...
- 请给出异步加载js方案
请给出异步加载js方案,不少于两种 默认情况javascript是同步加载的,也就是javascript的加载时阻塞的,后面的元素要等待javascript加载完毕后才能进行再加载,对于一些意义不是很 ...
- V2X、OBU、RSU、V2V之间的协作关系
[自动驾驶]1.V2X.OBU.RSU.V2V之间的协作关系_Mister Zhu的博客-CSDN博客_obu和rsu 1. V2X.OBU.RSU.V2V 名词术语解释 OBU: On Board ...
- 【自动驾驶】1.V2X、OBU、RSU、V2V之间的协作关系
1. V2X.OBU.RSU.V2V 名词术语解释 OBU: On Board Unit 车载单元 RSU: Road Side Unit 路侧单元 V2V: Vehicle to Vehicle 车 ...
最新文章
- RecyclerView Adapter中notifyDataSetChanged 的作用
- markdown自动生成侧边栏TOC /目录
- python适合做后端开发吗-转行IT做后端开发,学python还是java?
- [codevs 2926] 黑白瓷砖(2002年安徽省队选拔赛)
- 关于报错stale element reference: element is not attach
- frida hook java层常用模板
- python textwrap_python2.7.3编译python模块学习- textwrap 文本包装和填充
- 《DSP using MATLAB 》示例Example6.3
- Matrix响应式软件应用类型博客模板
- win8超极本盘符误删找回数据的办法
- Idea在plugin的marketplace中一直查不到东西安装插件
- 高性能mysql 小查询_高性能MySQL06-查询优化(慢查询)
- 写科研论文的高级方法学
- 手撸反向传播算法(附代码)
- 网络QoS原理与实现
- 每个项目都不同:支持一个摄像头,到现在还没搞好
- 优化模型之指派问题(整数规划)
- 英文原版jdk 1.8 API文档
- 写给青春,写给军乐团
- 加解密篇 - 什么是加密加盐 (分析web3j的加盐处理)
热门文章
- 物联网设备数量激增,续航难题该如何解决?
- CSDN送你互联网大厂面试机会啦!
- 第二十二届中国科协年会开幕,百度CTO王海峰等共话产业发展机遇
- Google X 新项目,用计算机视觉养鱼?
- 程序员必须掌握的 CPU 硬核干货!
- 倪光南:中国 5G 有望成为世界第一
- 天猫回应“双11数据造假”:已启动司法流程;小米折叠手机专利曝光;ASP.NET感染勒索软件|极客头条...
- 英特尔“宠坏”程序员!
- Python 爬取知乎 9674 个问答,揭秘最受欢迎的 98 本书!
- 谷歌最新开源的工具可以自动化查找并修复 bug!