Мне нужно создать подписку на Observable
тот, который сразу же удаляется при первом вызове.
Есть ли что-то вроде:
observable.subscribeOnce(func);
В моем случае я создаю подписку в обработчике экспресс-маршрута, и подписка вызывается несколько раз для каждого запроса.
observable.pipe(first()).subscribe(func)
, гдеfirst
происходит отrxjs/operators
.RxJS имеет одни из лучших документов, которые я когда-либо встречал. Следуя приведенной ниже ссылке, вы попадете в чрезвычайно полезные сценарии использования таблиц для операторов. Например, в разделе «Я хочу , чтобы занять первое значение» случай использования трех операторов:
first
,firstOrDefault
, иsample
.Обратите внимание, что если наблюдаемая последовательность завершается без уведомлений, то
first
оператор уведомляет подписчиков с ошибкой, в то время какfirstOrDefault
оператор предоставляет подписчикам значение по умолчанию.поиск варианта использования оператора
источник
Если вы хотите вызывать Observable только один раз, это означает, что вы не собираетесь ждать от него потока. Таким образом, использование
toPromise()
вместоsubscribe()
было бы достаточно в вашем случае, так какtoPromise()
не требует отписки.источник
await
promise
В дополнение к ответу @ Brandon , использование
first()
или подобное также важно для обновления наBehaviorSubject
основе егоObservable
. Например (не проверено):источник
Чистая и удобная версия
В продолжение удивительного ответа M Fuat NUROĞLU о преобразовании наблюдаемого в обещание, вот очень удобная его версия.
Прелесть этого в том, что мы можем использовать это значение как обычную переменную, не вводя другой вложенный блок!
Это особенно удобно, когда вам нужно получить несколько значений из нескольких наблюдаемых. С иголочки.
Конечно, вам придется выполнить свою функцию сдерживания,
async
если вы собираетесь идти по этому маршруту. Вы также можете просто.then
обещать, если не хотите, чтобы содержащая функция была асинхроннойЯ не уверен, есть ли компромиссы с этим подходом, не стесняйтесь, дайте мне знать в комментариях, чтобы мы знали.
PS Если вам понравился этот ответ, не забудьте также подтвердить ответ M Fuat NUROĞLU :)
источник
У меня был похожий вопрос.
Ниже звонили еще позже из разных сменщиков состояний. Как я не хотел.
Я решил попробовать
unsubscribe()
после подписки, как показано ниже.subscribe(func).unsubscribe();
это какsubscribeOnce(func)
.Я надеюсь, что это помогло вам тоже.
источник