【发布时间】:2018-04-30 21:51:20
【问题描述】:
我有一组文件我想在 Angular 5 中上传(或至少 try 上传,个别失败是可以的),一次一个,然后知道所有订阅的时间已完成。
在 Javascript 的旧时代,我会使用链式回调来完成此操作,但由于我们现在拥有像 rxjs 这样的出色工具,我觉得有一种更好、更“反应性”的方式来做到这一点。
那么:用 rxJS 最好的方法是什么?
我有一个 Angular 提供程序,它上传单个文件并返回一个 Observable;我想尝试单独上传数组中的每个文件,并知道它们何时全部完成。
在下面的示例中,我将提供程序替换为一个简单的主题,该主题在随机时间后以随机成功或错误完成,试图模拟不稳定的互联网连接。
问题:当我使用 Observable.combineLatest() 时,只有在所有 Observables 都具有 next() 的结果时,我才会得到最终结果:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]。如果不是所有的 Observables 都完成了,我就永远不会得到结果。
此外,Observable 不会一次运行一个,而是一次运行。与 AJAX 请求一起使用时,它可能会使单元连接过载。
关于如何解决这个问题的任何想法?
constructor() {
let observables = [];
for (var i = 0; i < 100; i++) {
observables.push(this.testObservable(i));
}
Observable.combineLatest(observables)
.subscribe(res => {
console.log('success', res);
}, err => {
console.log('errors', err);
})
}
testObservable(param) {
let subject = new Subject;
let num = Math.random() * 10000;
console.log('starting', param)
setTimeout(() => {
if (Math.random() > 0.5) {
console.log('success', param);
subject.next(param);
} else {
console.log('error', param);
subject.error(param);
}
subject.complete();
}, num);
return subject;
}
【问题讨论】:
-
If not all the Observables complete, I never get a result at all.在这种情况下你想做什么?一段时间后放弃?您的上传不应该在某个时候失败吗?此外,您声明您不喜欢combineLatest,因为您在全部完成之前不会得到结果。您希望在每个完成后得到一个结果吗?或者,无论是否发生任何变化,您更愿意每 X 秒获得一次结果? -
我想知道所有 Observables 何时完成,无论它们是否“解析”了一个值。这个想法是知道何时以一种或另一种方式向用户提供流程已完成的反馈。这不是 RxJS 的方式吗?我可能需要重新考虑我的设计。