将cordova-http插件包含为可观察的

时间:2017-05-24 16:08:05

标签: angular http promise ionic2 observable

我们有一个当前正在使用angular http客户端的应用程序,但是有角度的http客户端无法执行证书固定,因此我们需要将其替换为ionic-native插件。这个插件“cordova-HTTP”返回Promise而不是Observable。由于这是我们的核心HTTP“路由器”类,许多其他服务依赖于它。因此,而不是重写所有期望Observable的服务,我想将Prmise包装为Observable。这是我到目前为止尝试做的事情,我在设备上没有错误,但是客户端一直挂着,就像等待Promise被解决一样。无论如何,我的方法和实施是否不正确?

return Observable.fromPromise(this.http.get(url, {}, this.headers,
  (res) => {
    return Promise.resolve(res);
  },
  (error) => {
    if (error.status === 401 || error.status === 403) {
      this.login().then( () => {
        return this.http.get(url, {}, this.headers);
      });
    } else {
      this.log.error("Problem with authenticated get", error.error);
      return Promise.reject(error);
    }
  }
));

1 个答案:

答案 0 :(得分:2)

最后我解决了我的问题:

return Observable.create( (observer) => {
  this.http.get(url, {}, this.headers)
  .then( (response) => {
    observer.next(new AuthResponse(response.headers, response.data));
    observer.complete();
  })
  .catch( (error) => {
    if (error.status === 401 || error.status === 403) {
      this.login().then( () => {
        this.http.get(url, {}, this.headers)
        .then( (response) => {
          observer.next(new AuthResponse(response.headers, response.data));
          observer.complete();
        })
        .catch( (error) => {
          this.log.error("Problem with authenticated get", error.error);
          observer.error(error);
        });
      });
    } else {
      this.log.error("Problem with authenticated get", error.error);
      observer.error(error);
    }
  });
});