异步编程的模式

一、回调函数

function f1(callback){
    setTimeout(function () {
        // f1的任务代码
        callback();
    }, 1000);
}
f1(f2);

优点是简单、容易理解和部署,缺点是不利于代码的阅读和维护,各个部分之间高度耦合(Coupling),使得程序结构混乱、流程难以追踪(尤其是回调函数嵌套的情况),而且每个任务只能指定一个回调函数。

简单,难维护,高耦合

二、事件监听

事件驱动模式。任务的执行不取决于代码的顺序,而取决于某个事件是否发生

f1.on(‘done‘, f2);
function f1(){
    setTimeout(function () {
        // f1的任务代码
        f1.trigger(‘done‘);
    }, 1000);
}

优点是比较容易理解,可以绑定多个事件,每个事件可以指定多个回调函数,而且可以"去耦合"(Decoupling),有利于实现模块化。缺点是整个程序都要变成事件驱动型,运行流程会变得很不清晰。

可绑多个,事件驱动流程不清晰

三、发布/订阅

如果存在一个"信号中心",某个任务执行完成,就向信号中心"发布"(publish)一个信号,其他任务可以向信号中心"订阅"(subscribe)这个信号,从而知道什么时候自己可以开始执行。这就叫做"发布/订阅模式"(publish-subscribe pattern),又称"观察者模式"(observer pattern)

jQuery.subscribe("done", f2);
function f1(){
    setTimeout(function () {
        // f1的任务代码
        jQuery.publish("done");
    }, 1000);
}
jQuery.unsubscribe("done", f2);

与"事件监听"类似,但是明显优于后者。因为我们可以通过查看"消息中心",了解存在多少信号、每个信号有多少订阅者,从而监控程序的运行

有消息中心

四、promise

Promises:对象,代理(异步与同步的中介)

思想:每一个异步任务立刻返回一个Promise对象,由于是立刻返回,所以可以采用同步操作的流程。这个Promises对象有一个then方法,允许指定回调函数,在异步任务完成后调用

(new Promise(f1)).then(f2);

使用正常的程序流程(同步),来处理异步操作

promise接口:三种状态:未完成(pending)、已完成(fulfilled)、失败(rejected)。这三种的状态的变化途径只有两个,且只能发生一次:从“未完成”到“已完成”,或者从“未完成”到“失败”。一旦当前状态变为“已完成”或“失败”,就意味着不会再发生状态变化了

(new Promise(step1))
.then(step2)
.then(step3)
.then(step4)
.then(console.log, console.error);  //Promises对象的错误有传递性

promise对象的实现没看。

一个任务已完成,再加回调,会立即执行。  

时间: 2024-12-24 00:15:43

异步编程的模式的相关文章

简单实现异步编程promise模式

本篇文章主要介绍了异步编程promise模式的简单实现,并对每一步进行了分析,需要的朋友可以参考下 异步编程 javascript异步编程, web2.0时代比较热门的编程方式,我们平时码的时候也或多或少用到,最典型的就是异步ajax,发送异步请求,绑定回调函数,请求响应之后调用指定的 回调函数,没有阻塞其他代码的执行.还有像setTimeout方法同样也是异步执行回调的方法. 如果对异步编程还不太熟悉的话,直接戳 阮一峰大牛的教程 ,这篇文章介绍了四种异步编程的方式: 回调函数 事件监听 发布

异步编程解决方案之事件发布/订阅模式

时间监听模式是广泛用于异步编程的模式,是回调函数的事件化,又称不发订阅模式. nodejs的events模块就是发布订阅模式的一个简单实现,不存在preventDefault,stopPropagation,stopImmediatePropagation,等控制事件传递的方法. 它具有addListner/on(),once(),removeListner(),removeAllLisetner()和emit等基础监听事件方法. 事件发布/订阅十分简单,如下: //订阅 emitter.on(

nodejs学习笔记 —— 异步编程解决方案

在js或者node编程中,由于异步的频繁和广度使用,使得回调和嵌套的深度导致编程的体验遇到一些挑战,如果写出优雅和好看的代码,本文主要针对异步编程的主流方案做一些总结 1.事件发布/订阅模式 事件监听器模式是一种广泛用于异步编程的模式, 是回调函数的事件化,又称发布/订阅模式, node自身提供events模块,是该模式的一个简单实现. EventPorxy 2.promise/deferrd模式 在2009年被Kris Zyp抽象为一个提议草案,发布在CommonJS规范中, 目前,Commo

在JavaScript中实现异步编程模式的方法

本文总结了”异步模式”编程的4种方法,理解它们可以让你写出结构更合理.性能更出色.维护更方便的Javascript程序. 一.回调函数 这是异步编程最基本的方法. 假定有两个函数f1和f2,后者等待前者的执行结果. f1(); f2(); 如果f1是一个很耗时的任务,可以考虑改写f1,把f2写成f1的回调函数. function f1(callback){ setTimeout(function () { // f1的任务代码 callback(); }, 1000); } 执行代码就变成下面这

第二部分:异步编程初探与reactor模式

作者:[email protected]http://krondo.com/?p=1247  译者:杨晓伟(采用意译) 这个系列是从这里开始的,欢迎你再次来到这里来.现在我们可能要写一些代码.在开始之前,我们都做出一些必要的假设. 关于对你的假设 在展开讨论前,我假设你已经有过用Python写同步程序的经历并且至少知道一点有关Python的Sockt编程的经验.如果你从没有写过Socket程序,或许你可以去看看Socket模块的文档,尤其是后面的示例代码.如果你没有用过Python的话,那后面的

异步编程模式

.NET Framework 提供了三种异步操作模式: 异步编程模型(APM) 模式(也叫 IAsyncResult 模式),这些异步操作需要 Begin和End 方法(例如用于写操作的 BeginWrite 和EndWrite ).这种模式已经不推荐在新项目中使用.更多信息参考: 异步编程模型 (APM). 基于事件的异步模式 (EAP),这种模式的方法带有Async 后辍,并需要一个或多个事件,事件处理的委托类型以及 EventArg-驱动的类型.EAP 自 .NET Framework 2

.NET “底层”异步编程模式——异步编程模型

本文内容 异步编程类型 环境 异步编程模型(APM) 参考资料 首先澄清,异步编程模式(Asynchronous Programming Patterns)与异步编程模型(Asynchronous Programming Model,APM),它们的中文翻译只差一个字,英文名称差在最后一个单词,看英文一个是 Pattern,一个是 Model.Model 比 Pattern 更具体.前者是一个统称,比后者含义要广,前者包含三个模型,而 APM 只是它其中一个而已. 个人理解,异步编程模型(APM

基于任务的异步编程模式,Task-based Asynchronous Pattern

术语: APM           异步编程模型,Asynchronous Programming Model EAP           基于事件的异步编程模式,Event-based Asynchronous Pattern TAP           基于任务的异步编程模式,Task-based Asynchronous Pattern

[.net 多线程]异步编程模式

从.NET 4.5开始,支持的三种异步编程模式: 基于事件的异步编程设计模式 (EAP,Event-based Asynchronous Pattern) 异步编程模型(APM,Asynchronous Programming Model) 基于任务的编程模型(TAP,Task-based Asynchronous Pattern) 基于任务的异步模式 (TAP) 是基于 System.Threading.Tasks 命名空间的 Task 和 Task<TResult>,用于表示任意异步操作.