Promises, Observables, Subjects и BehaviorSubjects часто используются для обработки асинхронных событий в Angular. На самом деле это концепции, не ограничивающиеся только angular, и реализуемые различными библиотеками.

Синхронные и асинхронные события

Хотя мы все сталкивались с синхронными событиями при программировании на таких языках, как C или C++, асинхронные события оказались очень интересной концепцией, когда я начал изучать angular 2 и NodeJS. Когда мы пишем код на C++, мы часто вставляем операторы printf, в разные блоки, чтобы проверить, производит ли код вывод так, как нам хотелось бы. Предположим, вы начинаете с оператора вроде «printf(«вычисление чисел Фибоначчи»)», затем переходите к вычислению 1 миллиона чисел Фибоначчи и, наконец, печатаете последнее.

Если мы делаем это на таком языке, как C++, последний оператор печати будет выполняться только после того, как будут вычислены все числа Фибоначчи, даже если для вычисления требуется 2 секунды. Следует отметить, что код будет выполняться последовательно, блок за блоком или оператор за оператором, как мы написали. Что, если мы заменим печать чисел Фибоначчи запросом к базе данных, а используемым языком будет Javascript? Когда будет выполнен последний оператор печати? Ответ таков: он будет выполнен до того, как будет выполнен оператор запроса к базе данных. Почему? Это связано с асинхронным однопоточным характером Javascript.

Асинхронная обработка — это не что иное, как обработка событий, требующих немедленного внимания, и предоставление возможности тем, кому требуется связь с внешним миром, подождать, пока они не закончат с этим. Движок Javascript имеет архитектуру однопоточного цикла обработки событий для обработки таких событий.

Архитектура JavaScript с однопоточным циклом обработки событий

В отличие от многих других языков, Javascript является однопоточным, и всякий раз, когда происходит асинхронное событие, для него регистрируется обратный вызов, и движок продолжает обрабатывать другие события в очереди. Из МДН,

Функция обратного вызова — это функция, передаваемая в другую функцию в качестве аргумента, которая затем вызывается внутри внешней функции для завершения какой-либо подпрограммы или действия.

Для асинхронных событий можно предположить, что это функция, которая будет выполнять какое-то действие (например, проверять данные, полученные из запроса к базе данных) после завершения события.

Роль Promises и Observables

Promises и Observables используются для обработки событий. Важно отметить, что эти концепции не ограничиваются Angular. Существуют библиотеки, такие как RxJS, реализующие эти концепции, и их можно использовать на разных платформах.

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

Согласно МДН,

Объект Promise представляет возможное завершение (или сбой) асинхронной операции и его результирующее значение.

Объект обещания используется для обработки завершения одиночного асинхронного события. Если асинхронное событие не может вернуть данные немедленно, оно вернет прокси-сервер (называемый Promise), что означает, что данные будут предоставлены, как только они будут получены. Если компонент хочет получить что-то только один раз из службы (которая может сделать вызов API), тогда вызываемая функция из службы может вернуть обещание, на которое можно подписаться в компоненте. Обещание имеет два обработчика Resolve и Reject, которые можно использовать для выполнения действия, если обещание было разрешено или отклонено.

var promise1 = new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(‘resolved’);
reject(“rejected”);
}, 300);
});
promise1.catch(function(value) {
console.log(value);
// expected output: “foo”
});
promise1.then(function(value) {
console.log(value);
// expected output: “foo”
});
console.log(promise1);
// expected output: [object Promise]

Поскольку промис может быть либо выполнен, либо полностью отклонен, здесь вызывается только один из обработчиков.

Наблюдаемые

Наблюдаемые объекты, в отличие от промисов, используются для обработки нескольких событий или, скорее, потока событий. Небольшой пример:

myObservable.subscribe(()=>{
//doSomething when next called},()=>{
//do something when error occurs in emitting event},()=>{
//This is optional,called when stream of events is over}
)

Здесь myObservable — это Observable, на который делается подписка. Он имеет три обратных вызова для следующего, ошибки и завершения. Next вызывается каждый раз, когда возникает событие, а два других имени говорят сами за себя. Таким образом, функция в сервисе, которая сделала вызов API, подпишется на возвращаемый ею наблюдаемый объект.

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

Темы поведения

BehaviorSubjects похожи на Observables с несколькими другими важными качествами: 1) Они генерируют событие даже при подписке 2) Их нужно инициализировать значением 3) Последнее значение в потоке всегда можно получить с помощью метода getValue().

Обычно BehaviorSubject используется, когда мы хотим узнать последнее значение, если событие не произошло.

Спасибо за чтение. Если есть какие-либо ошибки или предложения, отправьте электронное письмо по адресу [email protected].

Использованная литература:









Легко понять определение «асинхронного события?
Я часто сталкивался с этим термином, и даже после поиска в Google до сих пор не могу понять, что именно он означает. Есть ли какой-нибудь…stackoverflow.com»