【问题标题】:Finish observable after executing promise执行 promise 后完成 observable
【发布时间】:2021-05-26 18:34:32
【问题描述】:

我必须同时使用promise和observable。

我的前端使用 Angular,在我的代码中,我必须使用另一个 JavaScript 库。

我必须使用这个返回承诺的 JavaScript 库创建许多请求。

let pki = new Library();
let signed: Array<string> = []

const AssinaObservable = new Observable((observers) => {
  observers.next(
    tokens.forEach( (value,index) => {
      pki.sign({thumbprint:thumbprint, token: value})
      .success(result => {
        signed.push(result);
      })
    })
  )
});

observers.complete()
return MyObservable;

我希望仅在执行 foreach 中的所有请求后才能完成我的 observable。

我已经尝试了很多事情,但在执行我的所有请求之前我找不到它完成的原因。

pki.sign 返回一个承诺。 await 不适用于此功能。

【问题讨论】:

  • 完全不清楚你在这里做什么。 tokensMyObservable 是什么?另外:tokens.forEach 不会返回任何内容,因此您不会向observers.next 发送任何内容。

标签: java promise rxjs observable


【解决方案1】:

您可以使用 rxJs 运算符 forkJoin 在执行多个 Promise 后完成一个 observable。只需将一组 Promises 传递给它,它就会调用 next 并在所有 Promise 完成后完成。你应该在 observable 的订阅中处理 promise 数据。

let pki = new Library();
let signed: Array<string> = []

const promises = tokens.map( (value, index) => {
    return pki.sign({thumbprint:thumbprint, token: value});
});

forkJoin(promises)
    .subscribe({
        next: (data) => signed.push(result) // handle next ,
        complete: () => // complete called,
    });

【讨论】:

    【解决方案2】:

    您可以使用 RxJS from 函数将 promise 转换为 observable。相应地,也可以使用 Array#map 和 RxJS forkJoin 来并行触发多个 observables。它会返回一个响应数组。

    试试下面的

    import { Observable, from } from 'rxjs';
    import { forkJoin } from 'rxjs/operators';
    
    public someFunction(): Observable<any> {
      return forkJoin(
        tokens.map(value => 
          from(pki.sign({thumbprint: thumbprint, token: value}).success())
        )
      );
    }
    

    【讨论】:

    • 如果你使用forkJoin,你不需要将promise转换为observable。见rxjs.dev/api/index/function/forkJoinforkJoin 接受一个 ObservableInput 类型参数,它“扩展”了一个 PromiseLike 类型。
    猜你喜欢
    • 2016-09-15
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多