Angular 将cordova http插件承诺包装为可观察

Angular 将cordova http插件承诺包装为可观察,angular,http,promise,ionic2,observable,Angular,Http,Promise,Ionic2,Observable,我们有一个应用程序目前正在使用angular http客户端,但是angular http客户端无法执行证书固定,因此我们需要用ionic本机插件替换它。这个插件“cordova HTTP”返回承诺,而不是可观察的。由于这是我们的核心HTTP“路由器”类,许多其他服务都依赖于它。因此,与其重写所有那些期望可观察的服务,我更愿意将Prmise包装为可观察的。这就是我到目前为止试图做的,我在设备上并没有得到任何错误,但客户端一直挂起,好像它在等待承诺得到解决。我的方法和实现是否有误 return O

我们有一个应用程序目前正在使用angular http客户端,但是angular http客户端无法执行证书固定,因此我们需要用ionic本机插件替换它。这个插件“cordova HTTP”返回承诺,而不是可观察的。由于这是我们的核心HTTP“路由器”类,许多其他服务都依赖于它。因此,与其重写所有那些期望可观察的服务,我更愿意将Prmise包装为可观察的。这就是我到目前为止试图做的,我在设备上并没有得到任何错误,但客户端一直挂起,好像它在等待承诺得到解决。我的方法和实现是否有误

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

最后我解决了我的问题:

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

错误处理是错误的。如果(error.status==401 | | error.status==403){…,则不会从
返回任何承诺,这显然会使承诺处于挂起状态。您需要正确链接承诺。我不确定是否存在其他特定于Cordova的问题。