Порядок действий при подписке

У меня есть такой код:

  get dislpayHello(): boolean {
    let result = false;
    console.info('start');
    
    let observable = of(true);
    observable.subscribe((display) => {
      console.info('set value');
      result = true;
    });

    console.info('finish');
    return result;
  }

StackBlitz

Я всегда думал, что какой бы обратный вызов мы ни поместили в subscribe(), он будет выполняться асинхронно, а поскольку JavaScript является однопоточным, обратный вызов будет выполнен после того, что останется в текущем блоке кода. Итак, в этом примере я ожидаю, что метод dislpayHello всегда будет возвращать false, а консоль будет регистрироваться в следующем порядке: «старт», «финиш», «setValue». Однако это не то, что происходит: когда я попробовал, блок подписки выполняется до остального кода. Неужели я все это время просто ошибался?

Как узнать, будет ли подписка осуществлена ​​немедленно или будет отложена? Есть ли какая-либо документация или статьи, которые я мог бы прочитать по этому поводу?

С промисами он будет вести себя так, как вы ожидали — даже если промис уже выполнен, обратный вызов, зарегистрированный с помощью .then, не будет вызван до следующего «тикания». С наблюдаемыми это не так; если вы .subscribe обращаетесь к наблюдаемому объекту, который уже отправил значение, обратный вызов вызывается немедленно с этим значением. Обратите внимание, что это не относится только к Angular: stackblitz.com/edit/rxjs-5mwclb?file=index.ts.

jonrsharpe 10.05.2024 12:12
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это заблуждение, что Observables всегда асинхронны, обычно потому, что они часто используются для обработки таких вещей, как HTTP-запросы, которые:

Observable — это лениво вычисляемое вычисление, которое может синхронно или асинхронно возвращать значения от нуля до (потенциально) бесконечных значений с момента его вызова.

Некоторые люди утверждают, что Observables асинхронны. Это неправда.

https://rxjs.dev/guide/observable

Рекомендую прочитать https://rxjs.dev/guide/observable, где это проясняется. Выдержки:

Некоторые люди утверждают, что Observables асинхронны. Это неправда. Если вы окружите вызов функции журналами, например:

console.info('before');
console.info(foo.call());
console.info('after');

(где foo определялось как):

    import { Observable } from 'rxjs';
     
    const foo = new Observable((subscriber) => {
      console.info('Hello');
      subscriber.next(42);
    });
     
    foo.subscribe((x) => {
      console.info(x);
    });
    foo.subscribe((y) => {
      console.info(y);
    });

Вы увидите результат:

"before"
"Hello"
42
"after"

И то же самое поведение с Observables:

console.info('before');
foo.subscribe((x) => {
  console.info(x);
});
console.info('after');

И результат:

"before"
"Hello"
42
"after"

Это доказывает, что подписка foo была полностью синхронной, как функция.

Observables могут доставлять значения синхронно или асинхронно.

В чем разница между Observable и функцией? Observables могут «возвращать» несколько значений с течением времени, чего не могут сделать функции.

Более того:

observable.subscribe() означает «дайте мне любое количество значений, синхронно или асинхронно»

По сути, subscribe может быть синхронным или асинхронным, в зависимости от того, как вы его используете. Если его next оценивается синхронно, то это синхронно. В противном случае это асинхронно.

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