Предположим, бизнес -сценарий:
С помощью адреса RSS получите RSS и сохраните его в файле, и адрес RSS сохраняется в файле.
Чтобы завершить бизнес в этом сценарии, требуются три задачи:
1. Прочитайте адрес RSS из файла.
2. Получите RSS.
3. Сохранить в файле.
Наконец, эти три задачи интегрированы.
Подготовить:
Файлы, которые хранят адрес RSS, address.txt.
http://programmer.csdn.net/rss_programmer.html
Задача 1:
Прочитайте содержимое файла адреса RSS и верните через обратный вызов.
Кода -копия выглядит следующим образом:
var getrssAddress = function (path, обратный вызов) {
fs.readfile (path, {кодирование: 'utf8'}, function (err, data) {
обратный вызов (Err, data);
});
}
Задача 2:
Получите RSS по адресу RSS и возврата ошибки или данных через обратный вызов.
Кода -копия выглядит следующим образом:
var getrss = function (url, обратный вызов) {
var data = '';
http.get (url, function (res) {
res.on ('data', function (chrunk) {
Данные += Chrunk;
});
res.on ('end', function () {
обратный вызов (null, data);
});
}). on ('error', function (err) {
обратный вызов (err, null);
});
}
Задача 3:
Сохраните RSS в файле и верните ошибку с помощью обратного вызова.
Кода -копия выглядит следующим образом:
var saverss = function (data, callback) {
fs.writefile ('rss.txt', data, 'utf8', function (err) {
обратный вызов (ERR);
});
}
Интеграция:
Кода -копия выглядит следующим образом:
getrssAddress ('address.txt', function (err, data) {
if (err) {
console.log (err);
возвращаться;
}
getRss (data, function (err, data) {
if (err) {
console.log (err);
возвращаться;
}
Saverss (data, function (err) {
if (err) console.log (err);
});
});
});
Приведенный выше код полностью асинхронная обработка. Наиболее распространенный обратный вызов используется для обработки возврата асинхронной логики. Преимущество заключается в том, что стандартный метод написания легко принять; Недостаток заключается в том, что связь слишком сильна, обработка исключений заключается в том, что код не является интуитивно понятным, особенно при работе со сложной бизнес -логикой и многими задачами, слоистые обратные вызовы заставляют людей смотреть на них, и код трудно поддерживать.
Одной из реализаций спецификации обещания является When.js, который предназначен для такой проблемной области.
Давайте посмотрим на измененный код.
Задача 1:
Кода -копия выглядит следующим образом:
var getrssAddress = function (path) {
var deferred = when.defer ();
fs.readfile (path, {кодирование: 'utf8'}, function (err, data) {
if (err) deferred.reject (err);
DEFERRED.Resolve (данные);
});
return DEFERRED.PROMISE;
}
Задача 2:
Кода -копия выглядит следующим образом:
var getrss = function (url) {
var deferred = when.defer ();
var data = '';
http.get (url, function (res) {
res.on ('data', function (chrunk) {
Данные += Chrunk;
});
res.on ('end', function () {
DEFERRED.Resolve (данные);
});
}). on ('error', function (err) {
deferred.reject (err);
});
return DEFERRED.PROMISE;
}
Задача 3:
Кода -копия выглядит следующим образом:
var saverss = function (data) {
var deferred = when.defer ();
fs.writefile ('rss.txt', data, 'utf8', function (err) {
if (err) deferred.reject (err);
deferred.resolve ();
});
return DEFERRED.PROMISE;
}
Интеграция:
Кода -копия выглядит следующим образом:
getrssAddress ('addry.txt')
.then (getrss)
.then (вкладчики)
.catch (function (err) {
console.log (err);
});
объяснять:
Модель «отложенное/обещание», определенная спецификацией обещания/A, представляет собой модель «публикация/подписчика». Публикация событий через отложенное объект может быть событием завершения разрешения или неудачным событием отклонения; Соответствующие заполненные или неудачные подписки выполняются через объект обещания.
В спецификации обещаний/A каждое задание имеет три состояния: по умолчанию (в ожидании), выполнено (выполнено) и не удалось (отвергнуто).
1. Состояние по умолчанию может быть передано в состояние завершения в одном направлении. Этот процесс называется решимостью, и соответствующий метод отложен.
2. Состояние по умолчанию также может быть передано в неудачное состояние в одном направлении. Этот процесс называется отклоненным, и соответствующий метод отложено. Deject (разум);
3. В состоянии по умолчанию вы также можете объявить информацию об выполнении задачи через DEFERRED.NOTIFY (UPDATE), например, прогресс выполнения;
4. Государственная передача единовременно. Как только задача изменится от первоначального ожидания в другие состояния, она введет процесс выполнения следующей задачи.
Следуйте вышеуказанному коду.
Определите отложенный объект через When.Defer.
var deferred = when.defer ();
После того, как асинхронные данные успешно получены, опубликовано событие завершения.
DEFERRED.Resolve (данные);
После того, как асинхронное получение данных не удалось, опубликовано неудачное событие.
deferred.reject (err);
И вернуть объект обещания в качестве подписки.
return DEFERRED.PROMISE;
Подписка - это подписка, которая завершена/не удалась/уведомлена с помощью тогдашнего метода объекта обещания.
getrssAddress ('addry.txt')
.then (getrss)
Тогда есть три параметра, а именно: Onfulfied, Onrehected и OnProgress
Обещание.
Предыдущей задачей является разрешение (данные), а функция Onfulfiled будет запускается, и данные будут использоваться в качестве параметра.
Если предыдущая задача была отклонена (причина), то Onrehected будет запускается, и будет получена причина.
В любое время можно запустить только один из наполненных и обезжиренных и только один раз.
Для обработки исключений, когда. JS также предоставляет чрезвычайно удобный метод. Тогда может передать ошибки. Когда несколько задач выполняются последовательно, мы можем определить только в последнем. Вы также можете вызвать функцию участия после последнего, чтобы поймать любое исключение задачи.
Это простой и четкий способ написать это.
Кода -копия выглядит следующим образом:
getrssAddress ('addry.txt')
.then (getrss)
.then (вкладчики)
.catch (function (err) {
console.log (err);
});
Обещание приносит большое удобство в асинхронное программирование, позволяя нам сосредоточиться на реализации единой задачи, не попадая в несчастье пирамиды. Приведенный выше код является только базовым использованием. When.js предоставляет гораздо больше, чем функции, упомянутые в этой статье, пожалуйста, обратитесь к официальному API для получения подробной информации.