В процессе написания Node.js непрерывные операции ввода -вывода могут привести к «кошмару пирамиды». Многократное гнездование функций обратного вызова затрудняет поддержание кода. Обещание CommonJS используется для инкапсуляции асинхронных функций и использования унифицированного API цепочки, чтобы избавиться от кошмара нескольких обратных вызовов.
Неблокирующая модель ввода-вывода, предоставленная Node.js, позволяет нам использовать функции обратного вызова для обработки операций ввода-вывода, но когда требуются непрерывные операции ввода-вывода, ваши функции обратного вызова будут вложены несколько раз, код не является красивым, и его нелегко поддерживать, и может быть много повторяющихся кодов для обработки ошибок, который является так называемым «пирамидом Doom».
Кода -копия выглядит следующим образом:
step1 (function (value1) {
step2 (value1, function (value2) {
Шаг3 (значение2, Функция (значение3) {
step4 (value3, function (value4) {
// Сделай что -нибудь со значением4
});
});
});
});
На самом деле это проблема потока управления в узле.js. Существует множество решений этой проблемы, таких как использование асинхронного, события и т. Д.
Что такое обещание?
Существует много типов спецификаций перспективных для CommonJ. Как правило, мы обсуждаем спецификацию обещания/A+, которая определяет основное поведение обещания.
Обещание - это объект, который обычно представляет собой асинхронную операцию, которая может быть завершена в будущем. Эта операция может преуспеть или потерпеть неудачу, поэтому объект перспектива обычно имеет 3 состояния: ожидание, выполнение и отклонение. Он представляет собой незаконченную, успешное завершение и сбой работы, соответственно. После того, как состояние обещания изменится с ожидания на выполнение или отклонение, его состояние не может быть снова изменено.
Объект перспектива обычно имеет метод, который позволяет нам управлять значением, возвращаемым после возможного успеха в будущем или причиной отказа. Этот метод выглядит так:
Обещание.
Очевидно, что тогдашний метод принимает два параметра, которые обычно представляют собой две функции, одна используется для обработки результата после успешной операции, а другая используется для обработки причины сбоя работы. Первые параметры этих двух функций являются результатом после успеха и причины сбоя. Если метод тогда не является функцией, то этот параметр будет проигнорирован.
Возвращаемое значение тогдашнего метода - это объект перспективы, который позволяет нам цепно вызовать, а затем достичь эффекта управления процессом. Здесь есть много деталей, таких как передача значений или обработка ошибок. Спецификация обещания определяется так:
Возвращаемое значение функции, основанной, не является объектом обещания, затем значение будет использоваться в качестве первого параметра, основанного на следующем методе. Если возвращаемое значение является объектом обещания, как может быть возвратное значение метода There быть объектом обещания
Если исключение добавлено в функцию Onfulfied или Onrehected, статус обращенного метода, возвращаемого объекта Specting, преобразуется в отклонение. Если тогда объект обещания вызовет, объект ошибки будет использоваться в качестве первого параметра функции Onrejected.
Если состояние обещания становится выполненным, а функция, основанная на подготовке, не предусмотрена в следующем методе, состояние объекта обещания, возвращаемое тогдашним методом, становится выполненным, и успешный результат является результатом предыдущего обещания, то же самое относится и к отклонению.
Чтобы добавить, как на протяженности, так и в обезьяне выполняются асинхронно.
Реализация спецификации: Q
Выше всего посвящено спецификации обещания, и то, что нам нужно, это его реализация. Q - это библиотека, которая имеет лучшие спецификации реализации для обещания/A+.
Прежде всего, нам нужно создать объект обещания. Спецификации для создания объекта обещания в обещании/b. Я не буду подробно объяснять здесь, просто добавьте код.
Кода -копия выглядит следующим образом:
function (flag) {
var defer = q.defer ();
fs.readfile ("a.txt", function (err, data) {
if (err) defer.reject (err);
else defer.resolve (data);
});
return Defer.promise;
}
Большинство обещаний реализации похожи в создании обещаний. Создавая объект DEFE с атрибутом Promise, если значение успешно получено, DEFER.Resolve (значение) вызывается, если оно не удается, DEFER.Reject (разум) называется и, наконец, возвращает атрибут обещания DEFE. Этот процесс можно понимать как призыв к вызову. Резульвирование превращает состояние обещания в исполненное, и призвание отложена. Дерезен превращает состояние обещания в отклоненное.
Столкнувшись с серией непрерывных асинхронных методов, как вы можете написать красивый код, используя обещание? Взгляните на следующий пример.
Кода -копия выглядит следующим образом:
Ording0.Then (function (result) {
// DOSOME
результат возврата;
}). Тогда (function (result) {
// DOSOME
вернуть обещание1;
}). Тогда (function (result) {
// DOSOME
}). Catch (function (ex) {
console.log (ex);
}). Наконец (function () {
console.log ("final");
});
В приведенном выше коде метод тогдашнего принимает только наполненное, и метод подъема фактически (NULL, ONRECECTINED). Таким образом, до тех пор, пока серия асинхронных методов всегда успешно возвращает значения, код будет работать вниз в стиле водопада. Если какой -либо из асинхронных методов не удается или происходит исключение, то в соответствии со спецификацией обещания CommonJS, функция в уловке будет выполнена. Q также предоставляет наконец -то метод, который легко понять буквально, то есть независимо от того, разрешается он или отвергает, функция, наконец, будет выполнена.
Это выглядит хорошо, код более поддерживается и красив, так что, если вы хотите параллелизм?
Кода -копия выглядит следующим образом:
Q.All ([Order0, Orders1, Orders2]). Распространение (функция (Val0, Val1, val2) {
console.log (аргументы);
}). Тогда (function () {
console.log ("Doning");
}). Catch (function (err) {
console.log (err);
});
Q также предоставляет API для параллелизма, вызывая все методы и прохождение массива перспективного массива может продолжать использовать стиль цепи тогда. Есть также хорошие вещи, такие как Q.nfbind и т. Д., Которые могут преобразовать нативный API node.js в обещание объединить формат кода. Больше API не будет описано подробно здесь.
в заключение
Эта статья в основном вводит использование обещания для решения проблемы потока управления Node.js, но обещание также может быть применено к фронтальному. EmcaScript6 предоставил собственную поддержку API. Следует отметить, что обещание - не единственное решение, асинхрон также является хорошим выбором и обеспечивает более дружеский API контроля параллелизма, но я думаю, что обещание имеет больше преимуществ при инкапсулировании функций с асинхронными методами.
Хорошо, это все для этой статьи, я надеюсь, что это будет полезно для всех.