Синхронное программирование, как правило, легко отлаживать и поддерживать, однако асинхронное программирование обычно обеспечивает лучшую производительность и большую гибкость. Самая большая особенность асинхронного заключается в том, что нет необходимости ждать. «Обещания» постепенно стали наиболее важной частью JavaScript, и большое количество новых API начало реализовать принцип обещания. Давайте посмотрим на то, что такое обещание, и его API и использование!
Обещает статус
API xmlhttprequest является асинхронным, но он не использует API обещания. Но есть много местных API JavaScript, которые используют обещание:
*Батарея API
*Fetch API (замена для XHR)
*ServiceWorker API
Обещания станут только более популярными и распространенными в будущем, и очень важно, чтобы все передовые разработчики использовали его. Еще одна вещь, которую стоит отметить, это то, что Node.js-это платформа, основанная на обещаниях (очевидно, что обещание является основной его особенностью).
Использование обещаний проще, чем вы думаете - если вы привыкли использовать SetTimeout для управления асинхронными задачами!
Основное использование обещания
Новый конструктор перспектива () может использоваться в традиционных асинхронных задачах, как и в предыдущем использовании SetTimeout и Xmlhttprequest. Новое обещание генерируется с использованием нового ключевого слова. В то же время, это обещание дает решимость и отклонение функций, позволяющих нам выполнять операции обратного вызова:
var p = новое обещание (функция (Resolve, doject) {// Do Async Async Async Async Tought, а затем ... if (/ * хорошее условие */) {Resolve ('успех!Программисты могут вручную вызовать решающую и отклонять функции в функции обратного вызова в соответствии с ситуацией выполнения. Вот более реалистичный пример, который преобразует призыв xmlhttprequest в задачу, основанную на обещаниях:
// из обещаний и обратно Джейка Арчибальда: // http://www.html5rocks.com/en/tutorials/es6/promises/#toc-promising-xmlhttprequestfunction get (url) {// вернуть новое обещание. вернуть новое обещание (function (Resolve, doject) {// Делать обычный xhr var var req = new xmlhttprequest (); req.open ('get', url); req.onload = function () {// Это называется даже на 404 и т.д. Resolve (REQ.Response); это! get ('story.json'). Затем (function (response) {console.log ("успех!", ответ);}, function (error) {console.error ("не удалось!", ошибка);});Ording.Resolve () и Orders.Reject () можно назвать напрямую. Иногда, когда мы определяем, что обещание не нужно выполнять, нам не нужно использовать новое для создания объекта обещания, но мы можем напрямую вызвать обещание например:
var usercache = {}; function getUserdetail (username) {// В обоих случаях, кэшированном или нет, обещание будет возвращено, если (usercache [username]) {// возвращать обещание без «Нового» return restry.resolve (usercache [username]); } // Использование API Fetch для получения информации // Fetch возвращает обещание возвращать fetch ('users/' + username + '.json') .then (function (result) {usercache [usermeme] = result; return result;}) .catch (function () {throw new Error ('не может найти пользователь:' + username);});Поскольку обещание определенно вернется, мы можем использовать методы Then and Catch для обработки возврата!
Затем метод
Все экземпляры объектов обещания имеют метод, который используется для взаимодействия с этим обещанием. Сначала метод затем вызовет функцию Resolve () по умолчанию:
Новое обещание (function (Resolve, disjuct) {// Mock Async Dection с использованием settimeout settimeout (function () {Resolve (10);}, 3000);}). Тогда (function (result) {console.log (result);}); // из консоли: // 10Тогда время запуска действия обратного вызова является то, что обещание выполняется. Мы также можем выполнить операции обратного вызова в соответствии с тогдашним методом:
Новое обещание (function (Resolve, disjuct) {// Mock Async Dection с использованием settimeout settimeout (function () {Resolve (10);}, 3000);}). Затем (function (num) {console.log ('сначала тогда:', num); вернуть num * 2;}). Тогда (функция (num) {console. }). Then (function (num) {console.log ('последнее тогда:', num);}); // из консоли: // сначала тогда: 10 // секунда тогда: 20 // последнее тогда: 40Вы обнаружите, что каждый потом вызов примет возвратное значение предыдущего, а затем вызов в качестве параметра.
Если обещание было выполнено, а сингл снова вызван, действие обратного вызова будет выполнено снова. Если функция обратного вызова отклонения выполняется в этом обещании, и затем метод вызовет, функция обратного вызова не будет выполнена.
Метод поймать
Поймайте, когда обещание будет отклонено (отвергнуто), метод улова будет выполнен:
Новое обещание (function (Resolve, disjuct) {// Mock Async Dection с использованием settimeout settimeout (function () {deact ('dode!');}, 3000);}). Тогда (function (e) {console.log ('dode', e);}). Catch (e) {console.log ('catch:', e); Сделанный!'Обычно мы обрабатываем результат сбоя выполнения в методе отклонения и выполняем результат исключения в улов:
отклонить (ошибка («данные не могут быть найдены»));
Обещание. Все метод
Часто существует сценарий, когда мы звоняем асинхронно: нам нужно одновременно назвать несколько асинхронных операций, но мы надеемся, что мы будем выполнять операцию ответа только после завершения всех операций - это роль обещания. Все. Обещание. Все метод может получать несколько обещаний в качестве параметров в виде массива, и функция обратного вызова будет вызвана после успешного выполнения всех этих обещаний.
Spect.all ([vormod1, vomeult2]). Тогда (function (результаты) {// оба обещания разрешены}). Catch (function (ошибка) {// одно или несколько обещаний были отклонены});Хороший пример использования обещания. Все - выполнить несколько вызовов операций AJAX (через Fetch):
var request1 = fetch ('/users.json'); var request2 = fetch ('/upport.json'); rape.all ([request1, request2]). Тогда (function (результаты) {// оба обещания выполнены!});Мы также можем выполнить сочетание API -интерфейсов избирательного и аккумуляторного состояния, потому что все они возвращают обещания:
Spect.all ([fetch ('/users.json'), navigator.getbattery ()]). Тогда (function (результаты) {// оба обещания выполнены!});После того, как функция отклонения вызвана в обещание, выполнение отклоняется и не может быть завершена нормально, ситуация будет немного сложной. Как только обещание будет отклонено, метод улова поймает первую выполненную функцию отклонения:
var req1 = новое обещание (function (Resolve, doject) {// Mock Async с использованием settimeout settimeout (function () {Resolve ('First!');}, 4000);}); var req2 = new Promise (function (Resolve, doject) {// Макет Async с использованием setTimeout setTimeout (function () {reject); 3000);}); spect.all ([req1, req2]). Тогда (function (refuls) {console.log ('then:', one);}). Catch (function (err) {console.log ('catch:', err);}); // из консоли: // catch: second!Обещание. Все является очень важным интерфейсом и сыграет важную роль во многих недавно рожденных API -интерфейсе.
Обещание
Обещание. Рас - это интересная функция - она не ждет, чтобы все обещания были разрешены или отвергнуты, но во всех обещаниях он будет стрелять до тех пор, пока одно исполнение заканчивается:
var req1 = новое обещание (function (Resolve, doject) {// Mock Async с использованием settimeout settimeout (function () {Resolve ('First!');}, 8000);}); var req2 = new Promise (function (Resolve, doject) {// Материал Async с использованием setTimeout setTimeout (function () {resvolve (); 3000);}); Spear.race ([[req1, req2]). Тогда (function (one) {console.log ('then:', one);}). Catch (function (один, два) {console.log ('catch:', один);}); // из консоли: // затем: второе!Полезный сценарий - загрузить ресурсы с нескольких серверов зеркала. Как только кто -то вернется, другой возврат не обрабатывается.
Научитесь использовать обещания
В последние несколько лет обещания стали очень горячей темой, и они даже были вытащены из JavaScript, чтобы стать языковой архитектурой. Я полагаю, что мы скоро увидим все больше и больше API JavaScript, которые будут использовать на основе обещаний шаблоны.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.