Welcome 微信登录

首页 / 脚本样式 / JavaScript / nodejs中简单实现Javascript Promise机制的实例

promise/deferred 是一个很好的处理异步调用编码的规范,下面以nodejs代码为类,来实现一个promise/A 规范的简单实现

复制代码 代码如下:
/**
 * Created with JetBrains WebStorm.
 * User: xuwenmin
 * Date: 14-4-1
 * Time: 上午9:54
 * To change this template use File | Settings | File Templates.
 */
var EventEmitter = require("events").EventEmitter;
var http = require("http");
var util = require("util");
// 定义promise对象
var Promise = function(){
    // 实现继承事件类
    EventEmitter.call(this);
}
// 继承事件通用方法
util.inherits(Promise, EventEmitter);
// then 方法为promise/A 规范中的方法
Promise.prototype.then = function(successHandler, errorHandler, progressHandler){
    if (typeof successHandler == "function"){
        this.once("success", successHandler);
    }
    if (typeof errorHandler === "function"){
        this.once("error", errorHandler);
    }
    if (typeof progressHandler === "function"){
        this.on("process", progressHandler);
    }
    return this;
}
// 定义延迟对象
// 包含一个状态和一个promise对象
var Deferred = function(){
    this.state = "unfulfilled";
    this.promise = new Promise();
}
Deferred.prototype.resolve = function(obj){
    this.state = "fulfilled";
    this.promise.emit("success", obj);
}
Deferred.prototype.reject = function(err){
    this.state = "failed";
    this.promise.emit("error", err);
}
Deferred.prototype.progress = function(data){
    this.promise.emit("process", data);
}
// 利用一个http请求来运用上面定义的promise/deferred
var client = function(){
    var options = {
        hostname:"www.baidu.com",
        port:80,
        path:"/",
        method: "get"
    };
    var deferred = new Deferred();
    var req = http.request(options, function(res){
        res.setEncoding("utf-8");
        var data = "";
        res.on("data", function(chunk){
            data += chunk;
            deferred.progress(chunk);
        });
        res.on("end", function(){
            deferred.resolve(data);
        });
    });
    req.on("error", function(err){
        deferred.reject(err);
    })
    req.end();
    return deferred.promise;
}
client().then(function(data){
    console.log("请求完成", data);
}, function(err){
    console.log("访问错误", err);
}, function(chunk){
    console.log("正在读取", chunk);
});

代码保存为promise.js,可以在命令行下面运行,直接输入node promise.js,即可看到运行效果。