2017-05-24 67 views
1

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

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

错误处理是错误的。没有承诺从'if(error.status === 401 || error.status === 403){...''返回,这显然会使承诺等待。你需要将承诺恰当地链接起来。我不确定是否还有其他特定于Cordova的问题。 – estus

回答

0

最后我解决我的问题:

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