从具有嵌套 Promise 的 Promise 中观察

Observable from a Promise with nested Promise

我有一个调用新 Xrm.WebApi 端点的服务。

这个端点 return 一个 Promise,它有一个嵌套的 Promise "json" (documentation),它允许获得 json returned by服务。

从这个 json 我使用 "parseData" 方法提取了一些数据,return 它作为一个对象数组。

我想 return 一个 Observable<MyObject[]>,但我现在只能得到一个 Observable<Promise<MyObject[]>>

我当前的代码如下所示:

return from(Xrm.WebApi.online.execute(crmRequest).then(
      result => {
        if (result.ok) {
          return result.json().then(json => {
            let res : MyObject[]= this.parseData(json);
            return res;
          }); 
        }
      },
      error => {
        throw error;
      }
    ));

环境:
- Angular 8.2
-RxJs 6.4

经过一些尝试,我使用以下代码实现了此功能:

return new Observable(observer => {
        Xrm.WebApi.online.execute(crmRequest).then(
          result => {
            if (result.ok) {
              result.json().then(json => {
                let res : MyObject[]= this.parseData(json);
                observer.next(res);
                observer.complete();
              });
            }
          },
          error => {
            observer.error(error);
          }
        );
      });

它创建一个带有自定义观察者的 Observable,并在嵌套的 Promise 中触发观察者 .next() 以 return 正确的数据。

使用 from 将您的第一个 Promise 转换为 Observable,并使用 switchMap 映射到内部 Promise。 filter 用于仅发出正常的结果,而 map 用于映射到您想要的输出。当第一个或第二个 Promise 出错时,此 Observable 将出错。

return from(Xrm.WebApi.online.execute(crmRequest)).pipe(
  filter(result => result.ok),
  switchMap(result => result.json()),
  map(json => this.parseData(json) as MyObject[]),
)

有关更多信息,请阅读我的回复: