Обещание/отложенное - это хорошая спецификация для обработки асинхронного кодирования вызовов. Следующее использует код Nodejs в качестве класса для реализации простой реализации Speciation/A Speciation
Кода -копия выглядит следующим образом:
/**
* Создан с помощью jetbrains Webstorm.
* Пользователь: Xuwenmin
* Дата: 14-4-1
* Время: 9:54
* Чтобы изменить этот шаблон Использовать файл | Настройки | Шаблоны файлов.
*/
var EventEmitter = require ('events'). EventEmiter;
var http = require ('http');
var util = require ('util');
// Определить объект обещания
var promise = function () {
// реализовать класс событий наследования
Eventemitter.call (это);
}
// Общий метод наследования событий
util.inherits (обещание, Eventemitter);
// затем метод является методом в спецификации обещания/A
Ording.Prototype.Then = function (успех -индлер, errorhandler, progresshandler) {
if (typeOf uscessHandler == 'function') {
this.once («успех», успех);
}
if (typeof errorhandler === 'function') {
this.once ('error', errorhandler);
}
if (typeof progresshandler === 'function') {
this.on ('process', progresshandler);
}
вернуть это;
}
// определить объект задержки
// содержит состояние и объект обещания
var deferred = function () {
this.state = 'невыполненный';
this.promise = new Promise ();
}
Deferred.prototype.resolve = function (obj) {
this.state = 'Fulfilling';
this.promise.emit («успех», obj);
}
Deferred.prototype.reject = function (err) {
this.state = 'не удалось';
this.promise.emit ('error', err);
}
Deferred.prototype.progress = function (data) {
this.promise.emit ('process', data);
}
// Использование HTTP -запроса для использования обещания/отложенного, определенного выше
var client = function () {
var options = {
HostName: 'www.baidu.com',
Порт: 80,
путь:'/',
Метод: '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;
Отложенный. Progress (Chunk);
});
res.on ('end', function () {
DEFERRED.Resolve (данные);
});
});
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);
});
Сохраните код как Spear.js, вы можете запустить его под командной строкой. Введите node promise.js непосредственно, чтобы увидеть эффект работы.