У меня есть сценарий, в котором я должен сделать несколько вызовов API, а затем показать несколько тостовых сообщений, информирующих пользователя, если вызовы были успешными или неудачными. В приведенном ниже коде метод processSaveResponses
вызывается до разрешения наблюдаемых. Метод processSaveResponses
отвечает за отображение всплывающих сообщений. Я понимаю, что это ожидаемое поведение, поскольку наблюдаемые являются асинхронными, но я не знаю, как «ждать», когда наблюдаемые закончили.
Методы deliveryPreferencesService.save
и deliveryPreferencesService.saveAutoEnroll
не зависят друг от друга, но deliveryPreferencesService.saveAutoEnroll
не следует вызывать в случае сбоя deliveryPreferencesService.save
.
private saveChanges(changeSet: DeliveryPreferencesChangeSet) {
let deliveryPrefernceResult;
let saveAutoEnroll = true;
const { accountPreferences: accountPreferenceChanges, autoEnrollPreferences: autoEnrollPreferenceChanges } = changeSet.changes;
if (accountPreferenceChanges.length) {
this.deliveryPreferencesService.save(accountPreferenceChanges).
subscribe(
() => deliveryPrefernceResult = true,
() => saveAutoEnroll = false);
}
if (autoEnrollPreferenceChanges.length) {
if (saveAutoEnroll) {
this.deliveryPreferencesService.saveAutoEnroll(autoEnrollPreferenceChanges).
subscribe(
() => console.log('save auto enroll completed'),
() => saveAutoEnroll = false);
}
}
this.processSaveResponses([{ success: deliveryPrefernceResult }, {success: saveAutoEnroll}]);
}
Вот код для processSaveResponses
:
if (every(responses, ['success', false])) {
this.showErrorToastr(this.ALL_CHANGES_FAILURE_MESSAGE);
}
else if (every(responses, ['success', true])) {
this.originalPreferences = cloneDeep(this.currentPreferences);
this.onChange.next();
this.showSuccessToastr(this.ALL_CHANGES_SUCCESS_MESSAGE);
}
else {
if ((responses[0] as any).success) {
this.originalPreferences.accountPreferenceSets = cloneDeep(this.currentPreferences.accountPreferenceSets);
this.showSuccessToastr(this.DELIVERY_PREFERENCES_SUCCESS_MESSAGE);
this.showErrorToastr(this.AUTO_ENROLL_FAILURE_MESSAGE);
} else {
this.originalPreferences.autoEnrollPreferences = cloneDeep(this.currentPreferences.autoEnrollPreferences);
this.showSuccessToastr(this.AUTO_ENROLL_SUCCESS_MESSAGE);
this.showErrorToastr(this.DELIVERY_PREFERENCES_FAILURE_MESSAGE);
}
}
}
Любая помощь будет оценена. Я использую rxjs версии 5.5.2.