多个异步之间的协作方案

简介: 业务逻辑可能依赖两个通过回调或事件传递

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

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)
      })
    })
  }
}
相关文章
|
前端开发 应用服务中间件 nginx
Next.js 创建项目到服务器部署(目录结构介绍、项目结构Demo、开发细节注意)
Next.js 创建项目到服务器部署(目录结构介绍、项目结构Demo、开发细节注意)
1504 0
|
6月前
|
存储 机器学习/深度学习 监控
如何监控员工的电脑——基于滑动时间窗口的Java事件聚合算法实现探析​
在企业管理场景中,如何监控员工的电脑操作行为是一个涉及效率与合规性的重要课题。传统方法依赖日志采集或屏幕截图,但数据量庞大且实时性不足。本文提出一种基于滑动时间窗口的事件聚合算法,通过Java语言实现高效、低资源占用的监控逻辑,为如何监控员工的电脑提供一种轻量化解决方案。
152 3
|
10月前
|
开发框架 .NET PHP
网站应用项目如何选择阿里云服务器实例规格+内存+CPU+带宽+操作系统等配置
对于使用阿里云服务器的搭建网站的用户来说,面对众多可选的实例规格和配置选项,我们应该如何做出最佳选择,以最大化业务效益并控制成本,成为大家比较关注的问题,如果实例、内存、CPU、带宽等配置选择不合适,可能会影响到自己业务在云服务器上的计算性能及后期运营状况,本文将详细解析企业在搭建网站应用项目时选购阿里云服务器应考虑的一些因素,以供参考。
|
9月前
|
程序员 API 开发者
实战阿里qwen2.5-coder 32B,如何配置Cline的Ollama API接口。
阿里Qwen2.5大模型开源免费,适合编程应用。在Ollama平台下载时,推荐选择带有“cline”字样的Qwen2.5-Coder版本,仅需额外下载适配文件,无需重复下载模型文件。Ollama环境永久免费,配置简单,效果出色,适合开发者使用。
5127 77
|
11月前
|
人工智能 atlas 开发工具
【AI系统】昇腾 AI 架构介绍
昇腾计算产业基于华为昇腾系列处理器,涵盖硬件、基础软件、应用使能等,构建全栈AI计算基础设施。华为通过开放硬件、开源软件,支持多框架,推动AI技术在端、边、云的广泛应用,促进AI产业生态繁荣。
916 1
|
机器学习/深度学习 人工智能 自然语言处理
一周打完1000场官司,中科院发布首个AI法庭AgentCourt!
【9月更文挑战第27天】中国科学院近日发布了名为AgentCourt的人工智能法庭技术,引发广泛关注。该技术可在一周内完成1000场官司的审理,有望显著提升司法效率,减少人为干扰,但同时也面临质疑,如是否能准确理解案件复杂性及背后的伦理、隐私和安全等问题。支持者认为它有助于提高判决公正性和一致性,而反对者则担忧其可能导致司法过程机械化,忽视人文因素。AgentCourt在自然语言处理和知识图谱构建方面展现了最新进展。论文详情见:https://doi.org/10.48550/arXiv.2408.08089
252 9
|
JavaScript 网络架构
|
XML 安全 Java
CVE-2017-9805:Struts2 REST插件远程执行命令漏洞(S2-052) 分析报告
一. 漏洞概述 2017年9月5日,Apache Struts 2官方发布一个严重级别的安全漏洞公告,该漏洞由国外安全研究组织lgtm.com的安全研究人员发现,漏洞编号为CVE-2017-9805(S2-052),在一定条件下,攻击者可以利用该漏洞远程发送精心构造的恶意数据包,获取业务数据或服务器权限,存在高安全风险。
10753 1
|
域名解析 Kubernetes 负载均衡
k8s两种部署架构,你们是哪一种?为什么面试官会问你你们怎么部署微服务的呢?
k8s两种部署架构,你们是哪一种?为什么面试官会问你你们怎么部署微服务的呢?
|
SQL 关系型数据库 MySQL
MySQL慢查询日志:如何定位执行慢的sql语句
MySQL慢查询日志:如何定位执行慢的sql语句
684 0
MySQL慢查询日志:如何定位执行慢的sql语句