nodejs中簡(jiǎn)單實(shí)現(xiàn)Javascript Promise機(jī)制的實(shí)例
promise/deferred 是一個(gè)很好的處理異步調(diào)用編碼的規(guī)范,下面以nodejs代碼為類,來實(shí)現(xiàn)一個(gè)promise/A 規(guī)范的簡(jiǎn)單實(shí)現(xiàn)
/**
* 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對(duì)象
var Promise = function(){
// 實(shí)現(xiàn)繼承事件類
EventEmitter.call(this);
}
// 繼承事件通用方法
util.inherits(Promise, EventEmitter);
// then 方法為promise/A 規(guī)范中的方法
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;
}
// 定義延遲對(duì)象
// 包含一個(gè)狀態(tài)和一個(gè)promise對(duì)象
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);
}
// 利用一個(gè)http請(qǐng)求來運(yùn)用上面定義的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('請(qǐng)求完成', data);
}, function(err){
console.log('訪問錯(cuò)誤', err);
}, function(chunk){
console.log('正在讀取', chunk);
});
代碼保存為promise.js,可以在命令行下面運(yùn)行,直接輸入node promise.js,即可看到運(yùn)行效果。
- node使用promise替代回調(diào)函數(shù)
- async/await與promise(nodejs中的異步操作問題)
- NodeJS的Promise的用法解析
- NodeJS中利用Promise來封裝異步函數(shù)
- node.js中使用q.js實(shí)現(xiàn)api的promise化
- 基于promise.js實(shí)現(xiàn)nodejs的promises庫(kù)
- Nodejs學(xué)習(xí)筆記之Global Objects全局對(duì)象
- 用nodejs訪問ActiveX對(duì)象,以操作Access數(shù)據(jù)庫(kù)為例。
- 詳解nodeJS之二進(jìn)制buffer對(duì)象
- Node.js 基礎(chǔ)教程之全局對(duì)象
- 深入理解Node內(nèi)建模塊和對(duì)象
- node.js Promise對(duì)象的使用方法實(shí)例分析
相關(guān)文章
Node.js實(shí)現(xiàn)壓縮與解壓數(shù)據(jù)
這篇文章介紹了Node.js實(shí)現(xiàn)壓縮與解壓數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07node.js + socket.io 實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)隨機(jī)匹配聊天
這篇文章主要介紹了node.js + socket.io 實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)隨機(jī)匹配聊天,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06Express中使用Swagger的實(shí)現(xiàn)示例
swagger-express是一個(gè)規(guī)范和完整的框架實(shí)現(xiàn),本文主要介紹了Express中使用Swagger的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12防止Node.js中錯(cuò)誤導(dǎo)致進(jìn)程阻塞的辦法
Node.js我們用到非常的多了,如果我們開發(fā)不當(dāng)可能因錯(cuò)誤導(dǎo)致進(jìn)程阻塞問題,對(duì)于進(jìn)程阻塞問題一直是個(gè)頭痛的事情,今天我們一起來看一篇關(guān)于Node.js防止錯(cuò)誤導(dǎo)致的進(jìn)程阻塞示例,下面一起來看看。2016-08-08微信小程序在線客服自動(dòng)回復(fù)功能(基于node)
這篇文章主要介紹了微信小程序在線客服自動(dòng)回復(fù)功能(基于node),由于小程序嵌套webview時(shí)需要校驗(yàn)域名,因此跳轉(zhuǎn)到第三方應(yīng)用市場(chǎng)和Appstroe無法實(shí)現(xiàn)導(dǎo)流。那怎么辦呢,需要的朋友可以參考下2019-07-07Node.js實(shí)現(xiàn)批量下載圖片簡(jiǎn)單操作示例
這篇文章主要介紹了Node.js實(shí)現(xiàn)批量下載圖片簡(jiǎn)單操作,結(jié)合實(shí)例形式分析了node.js批量下載圖片的具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2020-01-01詳解Node.js中exports和module.exports的區(qū)別
這篇文章主要介紹了詳解Node.js中exports和module.exports的區(qū)別,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04