Дождитесь асинхронных подписок, когда я выдам следующее значение

#rxjs #subject

#rxjs #предмет

Вопрос:

У меня есть следующий пример

 import { Subject } from "rxjs";  const subject = new Subject();  subject.subscribe(() =gt; new Promise(res =gt; {  setTimeout(() =gt; console.log('!! 1'), 500); }))  subject.subscribe(() =gt; new Promise(res =gt; {  setTimeout(() =gt; console.log('!! 2'), 1000); }))  console.log('gt;gt;gt; START') subject.next(); console.log('lt;lt;lt; FINISH')  

Консоль выглядит так

 gt;gt;gt; START lt;lt;lt; FINISH !! 1 !! 2  

Я хочу, чтобы вы вели себя следующим образом

 gt;gt;gt; START !! 1 !! 2 lt;lt;lt; FINISH  

Могу ли я достичь ожидаемого поведения или мне следует использовать другой подход?

Комментарии:

1. вы можете использовать toPromise() метод, но тогда будет выполнена только функция обратного вызова внутри subscribe метода, и, поскольку она async является хронологической, она будет помещена в очередь и не будет выполнена немедленно

2. При использовании .next() у вас нет контроля над тем, какие асинхронные события это вызовет, поэтому вы не можете их ждать. Здесь трудно дать какой-либо совет, вам придется полностью перестроить этот пример, чтобы он делал то, что вы ожидаете.

3. Может быть, используя подход по расписанию? Может ли он обеспечить аналогичную функциональность?

Ответ №1:

Хорошо, значит, это должно сработать. Я просто вынудил поведение Наблюдаемых. Чтобы было ясно, наблюдаемые являются асинхронным javascript и должны обмениваться значениями в асинхронном режиме, чтобы вы могли «выдавать» новое значение через объект, и все наблюдаемые могли видеть это значение при выполнении некоторых других задач. Этот код делает именно то, что вы просили, но нет смысла выдавать значение и ждать этого значения в том же месте и в тот же момент, для достижения этого вам, вероятно, следует подумать о другом способе кодирования этого модуля.

Сказав это, я протестировал этот фрагмент, и он работает, надеюсь, это поможет

 import { Subject } from "rxjs"; const subject = new Subject();  async function nextValue(value) {  return new Promise((resolve, reject) =gt; {  subject.subscribe(subValue =gt; {  setTimeout(() =gt; {  console.log(subValue);  resolve();  }, 500);  }, err =gt; reject(err));  subject.next(value);  }); }   (async () =gt; {  console.log('gt;gt;gt; START');  await nextValue('myValue');  console.log('lt;lt;lt; FINISH'); })();  

Комментарии:

1. Это может решить часть моих задач, спасибо!