异步编程解决方案之Promise/Deferred

Promise三种状态:未完成、完成态、失败态

var events = require(‘events‘);
var util = require(‘util‘);
var EventEmitter = events.EventEmitter;

var Promise = function () {
    EventEmitter.call(this);
}
util.inherits(Promise, EventEmitter);

Promise.prototype.then = function (fulfilledHandler, errorHandler, progressHandler) {
    if (typeof fulfilledHandler === ‘function‘) {
        //利用once()方法,保证成功回调执行一次
        this.once(‘success‘, fulfilledHandler)
    }

    if (typeof errorHandler === ‘function‘) {
        //利用once()方法,保证异常回调执行一次
        this.once(error, errorHandler)
    }

    if (typeof progressHandler === ‘function‘) {
        this.on(‘progress‘, progressHandler)
    }
    return this;
}

这里看到then方法就是将回调存放起来,为了完成整改流程,还需要触发回调函数的地方,实现这些函数的对象叫Deferred,即延迟对象

var Deferred = function () {
    this.state = ‘unfulfilled‘;
    this.promise = new Promise();
}
Deferred.prototype.resove = function (obj) {
    this.state = ‘fulfilled‘;
    this.promise.emit(‘success‘, obj);
}

Deferred.prototype.error = function (obj) {
    this.state = ‘failed‘;
    this.promise.emit(‘fail‘, obj);
}

Deferred.prototype.progress = function (data) {
    this.promise.emit(‘progress‘, data);
}

利用promise/A模式,我可以对典型的响应对象进行封装,代码如下:

res.setEncoding(‘utf8‘)
    res.on(‘data‘, function (chunk){
        console.log(chunk);
    })
    res.on(‘end‘, function (){
        console.log(‘end‘)
    })
    res.on(‘error‘, function (err) {
        console.log(‘err‘);
    })
    res.writeHead(‘200‘, {contentType: ‘text/plain‘});
    res.end(‘练习一下: promise test‘);

原文地址:https://www.cnblogs.com/yingquliang/p/9375034.html

时间: 2024-08-30 06:10:34

异步编程解决方案之Promise/Deferred的相关文章

Jquery中的异步编程浅析 延期(deferred)的承诺(promise)

引子 相信各位developers对js中的异步概念不会陌生,异步操作后的逻辑由回调函数来执行,回调函数(callback function)顾名思义就是"回头调用的函数",函数体事先已定义好,在未来的某个时候由某个事件触发调用,而这个时机,是程序本身无法控制的. 举几个常见例子: 事件绑定 动画 Ajax 上面的例子简单.典型,易于阅读和理解. 为了引出本文的主题,假设现在有3个ajax异步操作,分别为A.B.C,每个都封装成了函数,并可传入success回调作为参数. 请考虑以下场

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

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

一个例子读懂 JS 异步编程: Callback / Promise / Generator / Async

JS异步编程实践理解 回顾JS异步编程方法的发展,主要有以下几种方式: Callback Promise Generator Async 需求 显示购物车商品列表的页面,用户可以勾选想要删除商品(单选或多选),点击确认删除按钮后,将已勾选的商品清除购物车,页面显示剩余商品. 为了便于本文内容阐述,假设后端没有提供一个批量删除商品的接口,所以对用户选择的商品列表,需要逐个调用删除接口. 用一个定时器代表一次接口请求.那思路就是遍历存放用户已选择商品的id数组,逐个发起删除请求del,待全部删除完成

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

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

JavaScript异步编程助手:Promise模式 【转】

异步模式在Web编程中变得越来越重要,对于Web主流语言JavaScript来说,这种模式实现起来不是很利索,为此,许多 JavaScript库(比如 jQuery和Dojo.AngularJS)添加了一种称为Promise的抽象(术语称作Deferred模式).通过这些库,开发人员能够在实际编 程中使用Promise模式,每个Promise都拥有一个叫做then的唯一接口,当Promise失败或成功时,它就会进行回调.它代表了一种可能会 长时间运行而且不一定必须完成的操作结果.这种模式不会阻塞

javascript的异步编程解决方案收集

缘起 没理解js异步的同学看下面的例子: for (var i = 0; i < 5; i++) { //模拟一个异步操作 setTimeout(() => { console.log(i); }, 1000); } 我们想要的结果是:0,1,2,3,4 结果却出乎意料:5,5,5,5,5 分析 js的特点就是单线程异步非堵塞.需要好好理解这句话:js对于异步操作,不会停下来等待上一个异步操作完成,才进行下一个异步操作. 如果要达到顺序执行,只能用回调:也就是上一个异步操作完成时,再调用下一个

异步编程解决方案

事件发布/订阅模式 promise/deferrd模式 流程控制模式 事件发布/订阅模式 事件监听器模式是异步回调的事件化,又称发布订阅/模式 node核心模块events 方法 addListener/on once removeListener removeAllListeners emit 简单操作 let events = require('events') let request = require('http').request let emit = new events.Event

ES6 异步编程解决方案 之 Async

一.async 函数的基本用法 async 函数返回一个 Promise 对象,可以使用 then .catch 方法 添加回调函数 async 函数执行时,一旦遇到 await 就会先返回,等到异步操作完成,再接着执行函数体内后面的语句 [异步函数 同步执行] async 函数有很多种形式: // 函数声明 async function foo() {} // 函数表达式 const foo = async function () {}; // 箭头函数 const foo = async (

谈谈Javascript异步编程以及新的实现方法--Promise

最近看到好多文章都在讲promise,为什么现在异步编程会受到如此重视?又为什么异步编程要选择Promise呢? 先来说说第一个问题,异步编程能受到如此重视很大原因是因为javascript正在逐渐走向标准化.规范化(MVC,模块,OOP),所以一些传统编程领域的一些规范化约束发挥的作用也越来越大了,而且javascript本身就是围绕"异步"来进行的,无论是浏览器端还是node服务器端,大多数的API都是通过"事件"来将请求和返回值分离的.简单来说:javascr