【问题标题】:Piping Observables and Returning a Promise管道 Observables 并返回一个 Promise
【发布时间】:2019-03-28 20:18:54
【问题描述】:

为什么下面的代码会返回一个包含observablepromise

const queryApi = (request: AxiosRequestConfig): Observable<ParsedData> => {
  return new Observable(observer => {
      axios(request).then(response => {
          observer.next(response);
          observer.complete();
      }).catch(error => {
          observer.error(error);
      })
  }).pipe(map(value => {
      const parser = new Parser(name);
      const response = value as AxiosResponse;
      return parser.parse(response.data);
  }));
}

const sourcePromise: Promise<ParsedData> = queryApi(request, 1).toPromise();
await sourcePromise.then(source$ => {
    source$.subscribe((value: ParsedData) => console.log(JSON.stringify(value, null, 2)));
}).catch(error => console.log(error));

我期待代码:

  1. 使用 axios 查询 API
  2. 使用 axios 解析的值创建一个 observable
  3. 将可观察到的管道传递给返回 observablemap 运算符
  4. 将返回的observable 转换为promise
  5. 解析promise 公开数据。

【问题讨论】:

  • 我认为这可能与未完成有关,但如果你想得到一个承诺,为什么不首先返回一个承诺
  • 我没有使用过打字稿,但看起来你没有调用承诺,只是引用它。 sourcePromise.then -> sourcePromise().then
  • 你是说parser.parse返回一个observable?
  • 你为什么在这里使用 observables?你正在把一个承诺变成一个可观察的,然后把它变成一个承诺。直接使用 Promise 让你的代码更简单。
  • 该代码究竟在哪里“返回一个包含可观察对象的承诺”?

标签: javascript typescript rxjs


【解决方案1】:
// Using rxjs 6
// This should solve your problem.

import axios from 'axios';
import {from} from 'rxjs';
import {map} from 'rxjs/operators';

const queryApi = request => from(axios(request)).pipe(map(res => res.data));

//Make sure to subscribe to the observable

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 2021-10-18
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    相关资源
    最近更新 更多