Слияние внутренних и внешних наблюдаемых значений:
Для объединения внутренних и внешних наблюдаемых значений можно использовать оператор switchMap
rx js.
this.newClientId
.pipe(
take(1),
switchMap(
clientId => this.confirmDialogService.ask('DSf'),
(clientId, answer) => [clientId, answer]
)
)
.subscribe(([clientId, answer]) => {
console.log(`Received client id is: ${clientId} and confirmation from user is: ${answer}`);
// Perform your logic now
});
Существует несколько переопределенных версий для оператора switchMap
, и я показал одну с селекторной функцией (подробнее рассмотрим второй аргумент оператора). Обычно, если функция селектора опущена, возвращается только значение внутренней наблюдаемой. Вы можете использовать функцию селектора, чтобы настроить свои выходные данные для включения значений как внешних, так и внутренних наблюдаемых, объединяя их в массив, как показано в примере выше.
Проверьте demo rx js app Я создал для вашего сценария использования в stackblitz.
Для получения дополнительной информации о switchMap и функциях селектора в switchMap, обратитесь к этой статье . Я настоятельно рекомендую go в этой статье, если вы впервые используете оператор switchMap
.
АЛЬТЕРНАТИВНЫЙ МЕТОД:
Из своего фрагмента кода Я так понимаю, что вас интересует только первое значение наблюдаемого. В этом случае вместо объединения наблюдаемых можно использовать Promises и синтаксис ES6 async-await
, чтобы создать элегантное и простое решение.
С Promises и asyn c -wait вы можете изменить свой фрагмент кода как показано ниже:
async getResult() {
let clientId = await this.newClientId.toPromise();
let answer = await this.confirmDialogService.ask('DSf'),toPromise();
// perform your logic
}
В приведенном выше фрагменте кода метод confirmDialogService.ask()
не будет вызываться, пока newClientId
не вернет результат. Таким образом, вызовы asyn c происходят синхронно, и только после завершения 2 вызовов asyn c (в указанном порядке) он выполнит оставшуюся часть кода в методе.
EDIT: Обновлен ответ для решения проблемы с использованием оператора rx js.