【发布时间】:2019-08-17 02:09:17
【问题描述】:
我有一个场景,我必须进行一些 api 调用,然后显示一些 toast 消息,通知用户调用是成功还是失败。在下面的代码中,processSaveResponses 方法在可观察对象被解析之前被调用。 processSaveResponses 方法负责显示 toast 消息。我理解这是预期的行为,因为 observable 是异步的,但我不知道如何“等待”observable 完成的单元。
deliveryPreferencesService.save 和 deliveryPreferencesService.saveAutoEnroll 方法相互独立,但如果 deliveryPreferencesService.save 失败,则不应调用 deliveryPreferencesService.saveAutoEnroll。
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。
【问题讨论】:
-
您可以将 observable 更改为 promise,然后等待响应。然后完成您的通话。
标签: angular typescript rxjs observable rxjs5