【问题标题】:How can I execute an array of Observables in sequence, executing the next only once the previous observable has completed? [duplicate]如何按顺序执行一组 Observable,仅在前一个 observable 完成后才执行下一个? [复制]
【发布时间】:2018-04-08 09:13:03
【问题描述】:

假设我动态创建了一个 observables 数组:

let obsArray = dataArray.map((data) => observableFunc(data))

我想按顺序执行每个可观察对象,仅在 obsArray[n] 完成后执行 obsArray[n+1]。下一个 observable 的执行不依赖于前一个 observable 的结果。

在数组中的每个 observable 完成后,我想从处理这个 observable 数组的函数返回。

本质上,我想找到一个像 forkJoin 这样的方法来确保顺序执行。

【问题讨论】:

  • 我读它是因为 concat() 的签名不接受数组。再看一遍,也许我错了?编辑:没关系,它不会接受可观察的数组
  • 此问题与标记为已回答的问题不同。这个问题是关于可观察的数组而不是独立的可观察的。我在按顺序触发一组可观察对象时遇到了同样的问题。

标签: javascript angular asynchronous rxjs observable


【解决方案1】:

如前所述,concat 运算符可以将发出的值排列成一行。您可以按如下方式将 observable 数组传递给它(感谢 ES6 扩展运算符!):

const obsArray = [
  Rx.Observable.of(1, 2, 3), 
  Rx.Observable.of(4, 5, 6), 
  Rx.Observable.of(7, 8, 9)];

const example = Rx.Observable.concat(...obsArray);
// or using old apply method
// Rx.Observable.concat.apply(this, obsArray); 

// prints: 1,2,3,4,5,6,7,8,9
const subscribe = example.subscribe(val => console.log(val));

【讨论】:

  • 这在使用函数为 concat 运算符提供值时不起作用。
猜你喜欢
  • 1970-01-01
  • 2020-09-27
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多