Skip to content

Instantly share code, notes, and snippets.

@weger
Last active August 29, 2015 14:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save weger/2597f81a50025bf6099f to your computer and use it in GitHub Desktop.
Save weger/2597f81a50025bf6099f to your computer and use it in GitHub Desktop.
Node.js版Promise实现
var EventEmitter = require('events').EventEmitter;
var util = require('util');
var fs = require('fs');
/**
* promise 实现
*/
var Promise = function () {
EventEmitter.call(this);
};
util.inherits(Promise, EventEmitter);
Promise.prototype.then = function (fulfilledHandler, errorHandler) {
if (typeof fulfilledHandler === 'function') {
this.once('success', fulfilledHandler);
}
if (typeof errorHandler === 'function') {
this.once('error', errorHandler);
}
return this;
};
/**
* Deferred 实现
*/
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 (obj) {
this.state = 'failed';
this.promise.emit('error', obj);
};
/**
* 实例:文件读取
*/
var readFile = function (filename, encoding) {
var deferred = new Deferred();
fs.readFile(filename, encoding, function (err, data) {
if (err) {
deferred.reject(err);
} else {
deferred.resolve(data);
}
});
return deferred.promise;
};
readFile('filename', 'utf8').then(function (data) {
console.log(this.state); // filfulled
}, function (err) {
console.log(this.state); // failed
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment