首頁  >  文章  >  web前端  >  nodejs中簡單實作Javascript Promise機制的實例_node.js

nodejs中簡單實作Javascript Promise機制的實例_node.js

WBOY
WBOY原創
2016-05-16 16:28:441522瀏覽

promise/deferred 是一個很好的處理非同步呼叫編碼的規範,以下以nodejs程式碼為類,來實作一個promise/A 規範的簡單實作

複製程式碼 程式碼如下:

/**
 * 使用 JetBrains WebStorm 建立。
 * 使用者:xuwenmin
 * 日期:14-4-1
 * 時間:上午9:54
 * 若要變更此模板,請使用檔案|設定 |檔案模板。
 */

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,即可看到運行效果。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn