Асинхронное программирование в JavaScript постепенно было принято всеми. Ранее люди обычно реализовали его с помощью гнездования обратного вызова, SetTimeout, SetInterval и т. Д. Код выглядит очень неинтуитивным, и его трудно быстро понять, не глядя на всю логику кода. Асинхронные функции в JavaScript включают функции ввода/вывода (Ajax, Postmessage, IMG Load, нагрузка сценария и т. Д.), Функции времени (SetTimeout, SetInterval) и т. Д.
Мы все знакомы с ними. В сложных приложениях часто существует несколько слоев гнездования, и даже думают, что некоторые шаги не были выполнены, и исключения программы вызваны. Самый простой пример: например, если вы вводите узел в DOM, вы должны дождаться введения узла и управлять узлом. Когда вводится большое количество узлов, часто трудно понять время. Если у нас есть код, чтобы полагаться на данные сторонних API. Мы не можем узнать, как задержка ответа API, и другие части приложения могут быть заблокированы, пока он не вернет результат. Обещания обеспечивают лучшее решение этой проблемы, она не блокирует и полностью отделен от кода.
Итак, позвольте мне взглянуть на асинхронное программирование в JavaScript. Прежде всего, я рекомендую вам взглянуть на относительно популярные обещания/спецификацию.
Обещания/спецификация
Примечание: для простоты понимания описание может отличаться от спецификации обещаний/A;
Обещания/спецификация Commonjs упрощает асинхронное программирование путем стандартизации интерфейсов API, облегчая понимание нашего асинхронного логического кода.
Мы называем реализацию спецификации обещаний/A. Объект обещания имеет только три состояния: невыполненные, выполненные и неудачные; Первоначально он был создан с невыполненным состоянием, и государство может измениться только от нереализованного до выполнения или нереализованного к неудачному (неудачно/отклонено). Как только государство будет выполнено (завершено) или не удалось (не удалось/отклоняется), государство больше не может менять.
Спецификация обещаний/A предоставляет решение для описания концепции задержки (или будущего) в программе. Основная идея состоит не в том, чтобы выполнить метод, а затем заблокировать приложение и дождаться возврата результата, прежде чем вызовать другие методы, а вернуть объект обещания, чтобы удовлетворить будущее прослушивание. Как полноценное состояние, так и неудачное состояние можно слушать. Обещание регистрирует обратные вызовы, внедрив тогдашний интерфейс, чтобы вернуть объект обещания:
Кода -копия выглядит следующим образом: затем (FulfiledHandler, ErrorHandler, ProgressHandler);
Затем интерфейс используется для прослушивания разных состояний обещания. Fulfilledhandler используется для прослушивания исполненного состояния, ErrorHandler используется для прослушивания неудачного состояния, а ProgressHandler используется для прослушивания невыполненного состояния. Обещание не заставляет невыполненное прослушивание событий (например, мы знаем, что старая версия jQuery (1.5, 1.6) отложено - это реализация обещания, но не реализует невыполненное состояние слушания назад и вперед.
Обычно считается, что тогдашний интерфейс возвращает новый объект обещания, а не оригинальный объект обещания. Этот новый объект обещания может быть понят как представление о оригинальном объекте обещания. Он содержит только набор методов исходного объекта обещания. Эти методы могут соблюдать только статус исходного объекта перспектива, но не могут изменить внутреннее состояние отложенного объекта. Это может избежать конфликтов между несколькими абонентами, которые могут изменить состояние нового объекта обещания, не затрагивая других вызывающих абонентов.
Кроме того, обещание предоставляет два интерфейса, которые реализуют переходы состояния от разрешения (состояние реализации от незавершенного до завершенного) и отклонение (состояние реализации от незавершенного до отклонения или неудачи).
Отправить картинку, чтобы понять:
С обещанием вы можете написать асинхронную логику с синхронным мышлением. В асинхронных функциях вы не можете использовать Try/Catch, чтобы поймать исключения, и вы не можете бросить исключения. С обещанием мы можем прямо явно определить ошибку, который эквивалентен ловке исключений.
Ниже приведены несколько классовых библиотек, которые следуют по обещаниям/A A, когда, Q, RSVP.JS, jQuery.Deferred и т. Д.