angular - 在显示 toast 消息之前,如何确保我的所有 observables 都已完成?
问题描述
我有一个场景,我必须进行一些 api 调用,然后显示一些 toast 消息,通知用户调用是成功还是失败。在下面的代码中,该processSaveResponses
方法在可观察对象被解析之前被调用。该processSaveResponses
方法负责显示 toast 消息。我理解这是预期的行为,因为 observable 是异步的,但我不知道如何“等待”observable 完成的单元。
和方法相互独立,但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。
解决方案
尝试switchMap
按照此处所述使用。我想它可以在你的情况下使用。
https://www.learnrxjs.io/operators/transformation/switchmap.html
this.deliveryPreferencesService.save(accountPreferenceChanges)
.pipe(
switchMap(x => this.deliveryPreferencesService.saveAutoEnroll(autoEnrollPreferenceChanges))
)
.subscribe(() => {
// TODO something
})
在这种情况下this.deliveryPreferencesService.saveAutoEnroll(autoEnrollPreferenceChanges)
,只有在成功后才会调用this.deliveryPreferencesService.save(accountPreferenceChanges)
推荐阅读
- postgresql - 有效存储小时、分钟和秒
- python - 如何在sqlite中创建数据库并使用python导入多个csv文件
- python - Jupyter:Seaborn pairplot 难以设置图形尺寸?
- swift - 具有自定义属性的手势识别器和 UIImageView
- ruby-on-rails - 使用 ActiveStorage 的多个数据库
- node.js - Socket.io 使用零复制缓冲区读取和写入二进制数据
- java - 如何使用 Java 流查找不同对象的计数
- spring-integration - 使用 Spring Integration 将文件复制到另一个目录引发异常的基本示例
- php - 如何计算 php pdo 中的唯一行?
- python - Selenium, Python - 难以使用 XPath 表达式选择元素