国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

nodejs中簡單實現Javascript Promise機制的實例

2024-05-06 16:11:32
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了nodejs中簡單實現Javascript Promise機制的實例,本文在nodejs中簡單實現一個promise/A 規范,需要的朋友可以參考下
 
 

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 太原市| 秦安县| 仁寿县| 泗洪县| 阿克苏市| 达拉特旗| 会昌县| 福海县| 资源县| 靖江市| 罗山县| 宁都县| 凤庆县| 都兰县| 二连浩特市| 岢岚县| 五大连池市| 德昌县| 景洪市| 盖州市| 双桥区| 聂拉木县| 馆陶县| 库车县| 乌兰浩特市| 当雄县| 屏东县| 巴彦淖尔市| 白朗县| 禄劝| 土默特左旗| 康定县| 泸州市| 莆田市| 明光市| 辉南县| 屏山县| 定远县| 汕头市| 楚雄市| 佛冈县|