Наблюдается из обещания с вложенным обещанием

У меня есть служба, которая вызывает новую конечную точку Xrm.WebApi.

Эта конечная точка возвращает промис, который имеет вложенный промис "json" (документация), которая позволяет получить json, возвращаемый службой.

Из этого json я извлекаю некоторые данные с помощью метода «parseData», которые возвращают их в виде массива объектов.

Я хочу вернуть 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


person Dremor    schedule 18.12.2019    source источник
comment
Взгляните на эту ссылку, если вы еще не обновили до версии 6.x.x вы должны сделать это   -  person Fabian Schmidt    schedule 18.12.2019
comment
Если вы удалите from, будет ли возвращен тип Promise<Promise<MyObject[]>>?   -  person igg    schedule 18.12.2019
comment
@FabianSchmidt Я уже использую RxJs 6.4. Добавьте версию фреймворка в мой пост. @IraklisGkougkousis возвращает PromiseLike<Promise<MyObject>>.   -  person Dremor    schedule 18.12.2019


Ответы (2)


Используйте from для преобразования вашего первого промиса в Observable и используйте switchMap для сопоставления с внутренним промисом. filter используется только для получения результатов, которые в порядке, а map используется для сопоставления с желаемым результатом. Этот 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

person frido    schedule 19.12.2019

После некоторых попыток я получил это с помощью следующего кода:

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 с пользовательским Observer и запускает наблюдатель .next() во вложенном Promise, чтобы вернуть правильные данные.

person Dremor    schedule 18.12.2019