Вопрос

Из того, что я понял, есть три способа позвонить асинхронному коду:

  1. События, например, request.on("event", callback);
  2. Обратные обратные вызовы, например fs.open(path, flags, mode, callback);
  3. Обещания

Я нашел Библиотека узлов Но я этого не понимаю.

Может ли кто-нибудь объяснить, что все обещания, и почему я должен использовать это?

Кроме того, почему это было удалено из Node.js?

Это было полезно?

Решение

Обещания в node.js обещали выполнить некоторую работу, а затем имели отдельные обратные вызовы, которые будут выполнены для успеха и провалов, а также обработки тайм -аутов. Другим способом подумать о обещаниях в node.js было то, что они были излучателями, которые могли излучать только два события: успех и ошибку.

Прохладная вещь о обещаниях, вы можете объединить их в цепь зависимости (обещают C только при обещании и Обещание B завершено).

Удалив их из сердечника Node.js, он создал возможность наращивания модулей с различными реализациями обещаний, которые могут сидеть на верхней части ядра. Некоторые из них узел-обещание и Фьючерсы.

Другие советы

Поскольку этот вопрос все еще много взглядов (как мой), я хотел указать, что:

  1. узел-обещание выглядит довольно мертвым для меня (последний коммит был около 1 года назад) и содержит почти никаких испытаний.
  2. То Фьючерсы Модуль выглядит очень раздутым для меня и плохо документирован (и я думаю, что конвенции именования просто плохие)
  3. Лучший способ пойти, кажется, q рамки, что является активным, так и хорошо документированным.

Обещание - это «вещь», которая представляет «возможные» результаты операции так, чтобы говорить. В точке отметить вот то, что он тезисывает детали когда что-то происходит и позволяет сосредоточиться на том, что должно произойти после что что -то происходит. Это приведет к чистому, поддерживаемому коду, где вместо обратного вызова в обратном вызове ваш код будет похож на:

 var request = new Promise(function(resolve, reject) {
   //do an ajax call here. or a database request or whatever.
   //depending on its results, either call resolve(value) or reject(error)
   //where value is the thing which the operation's successful execution returns and
   //error is the thing which the operation's failure returns.
 });

 request.then(function successHandler(result) {
   //do something with the result
 }, function failureHandler(error) {
  //handle
 });

Спецификации обещаний утверждают, что обещание

then

Метод должен вернуть новое обещание, которое выполняется, когда заданный вызов успешного и отказа Это означает, что вы можете целовать обещания, когда у вас есть набор асинхронных задач, которые необходимо выполнить, и быть уверенным, что секвенирование операций гарантировано точно так же, как если бы вы использовали обратные вызовы. Таким образом, вместо того, чтобы передавать обратный вызов внутри обратного вызова, код с цепными обещаниями выглядит как:

var doStuff = firstAsyncFunction(url) {
                return new Promise(function(resolve, reject) {
                       $.ajax({
                        url: url,
                        success: function(data) {
                            resolve(data);
                        },
                        error: function(err) {
                             reject(err); 
                        } 
                  });
               };
doStuff
  .then(secondAsyncFunction) //returns a promise
  .then(thirdAsyncFunction); //returns a promise

Чтобы узнать больше о обещаниях и почему они являются супер прохладными, оформить заказ доменька: http://domenic.me/2012/10/14/youre-missing-point-of-promises/

Этот Новый учебник О обещаниях автора Pouchdb. Вероятно, лучше всего я видел. Это мудро охватывает классические ошибки новинок, показывающие вам правильные шаблоны использования и даже несколько анти-моделей, которые по-прежнему обычно используются - даже в других руководствах !!

Наслаждаться!

PS Я не ответил на некоторые другие части этого вопроса, поскольку они были хорошо покрыты другими.

Майк Таулти Имеет серию видео, Каждый из них длится меньше десяти минут, описывая, как работает библиотека обещания Winjs.

Эти видео вполне информативны, и Mike удается показать силу API обещания с несколькими известными примерами кода.

var twitterUrl = "http://search.twitter.com/search.json?q=windows";
var promise = WinJS.xhr({ url: twitterUrl });

 promise = promise.then(
     function (xhr) {
     },
     function (xhr) {
         // handle error
     });

Особенно хорошо обрабатывается обращение к исключениям, особенно хорошо.

Несмотря на ссылки WinJS, это видео -серия VIEWERS, потому что API Promise в целом схож во многих своих реализациях.

Просьба ответить это легкая реализация перспектива, которая проходит набор тестов обещания/A+. Мне очень нравится API, потому что он похож на интерфейс Winjs.

Обновить APR-2014

Кстати, библиотека Winjs теперь открытый источник.

Еще одним преимуществом обещаний является то, что обработка ошибок и бросание и бросание исключений намного лучше, чем пытаться справиться с обратными вызовами.

То синяя птица Библиотека реализует обещания и дает вам большие длинные следы стека, очень быстрые, и предупреждает о неосторожных ошибках. Это также быстрее и использует меньше памяти, чем другие библиотеки обещания, согласно http://bluebirdjs.com/docs/benchmarks.html

Что именно такое обещание?

Обещание - это просто объект, представляющий результат асинхронизации. Обещание может быть в любом из следующих 3 государств:

в ожидании :: Это начальное состояние, означает, что обещание не выполняется ни не отклонено.

выполнено :: Это означает, что обещание было выполнено, означает, что значение, представленное обещанием, готов к использованию.

отклоненный :: Это означает, что операции не удались и, следовательно, не могут выполнить обещание. Помимо штатов, есть три важных объекта, связанных с обещаниями, которые нам действительно нужно понять

  1. Функция исполнителя :: Функция исполнителя определяет операцию ASYNC, которая должна быть выполнена, и результат которого представлен обещанием. Он начинает выполнение, как только инициализируется объект обещания.

  2. Решимость :: Решимость - это параметры, переданные в функцию исполняющего исполнитель, и в случае, если Исполнитель успешно работает, это разрешение называется прохождение результата.

  3. Отклонить :: reject - другой параметр, передаваемый в функцию исполнителя, и он используется, когда функция исполнятеля не удалась. Причина отказа может быть передана на отклонение.

Поэтому, когда мы создаем объект обещания, мы должны предоставить исполнитель, решить и отклонить.

Справка :: Обещания

Я также смотрел в обещания в Node.js недавно. На сегодняшний день когда.js. кажется, способ идти из-за его скорости и использования ресурсов, но документация на Q.js. дал мне намного лучше понять. Так что используйте когда.js, но документы Q.js, чтобы понять предмет.

От Q.js. readme на github:

Если функция не может вернуть значение или бросить исключение без блокировки, вместо этого он может вернуть обещание. Обещание - это объект, который представляет собой возвращаемое значение или брошенное исключение, которое функция может в конечном итоге обеспечить. Обещание также можно использовать в качестве прокси для удаленного объекта для преодоления задержки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top