#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. Это может решить часть моих задач, спасибо!