【问题标题】:Observable from a Promise with nested Promise可从带有嵌套 Promise 的 Promise 中观察到
【发布时间】:2019-12-18 10:26:09
【问题描述】:

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

这个端点返回一个 Promise,它有一个嵌套的 Promise "json" (documentation),它允许获取服务返回的 json。

我使用“parseData”方法从这个 json 中提取一些数据,该方法将其作为对象数组返回。

我想返回一个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;
      }
    ));

环境:
- 角 8.2
- RxJs 6.4

【问题讨论】:

  • 看看这个link,如果你还没有更新到6.x.x版本,你应该这样做
  • 如果去掉from,返回的类型是Promise<Promise<MyObject[]>>吗?
  • @FabianSchmidt 我已经在使用 RxJs 6.4。将框架版本添加到我的帖子中。 @IraklisGkougkousis 它返回一个PromiseLike<Promise<MyObject>>

标签: angular rxjs xrm


【解决方案1】:

使用 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[]),
)

欲了解更多信息,请阅读我的回复:Convert Promise to Observable

【讨论】:

    【解决方案2】:

    经过一些尝试,我得到了以下代码:

    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);
              }
            );
          });
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 2020-12-15
      • 1970-01-01
      • 2022-06-21
      • 2018-11-13
      相关资源
      最近更新 更多