如何在使用HTTP+;toPromise()?
我发现建议的解决方案是使用可观察对象来设置http请求的超时 然而,我的代码的结构主要是使用承诺(在我希望数据自动更新的地方,我使用可观察的,而不是API调用的情况) 以下是我的代码(灵感来自Angular 2教程):如何在使用HTTP+;toPromise()?,http,angular,Http,Angular,我发现建议的解决方案是使用可观察对象来设置http请求的超时 然而,我的代码的结构主要是使用承诺(在我希望数据自动更新的地方,我使用可观察的,而不是API调用的情况) 以下是我的代码(灵感来自Angular 2教程): makePostRequest(requestUrl:string,requestBody:any,requestOptions?:requestOptions):承诺{ requestOptions=requestOptions | | newrequestoptions({h
makePostRequest(requestUrl:string,requestBody:any,requestOptions?:requestOptions):承诺{
requestOptions=requestOptions | | newrequestoptions({headers:this._defaultHeaders});
返回此信息。_http.post(requestUrl,JSON.stringify(requestBody),requestOptions)
.toPromise()
.然后(此.extractData)
.接住(这个.把手错误)
}
如何设置超时并抛出错误(如果超时过期),然后捕获。catch()或-或者-使用可观察对象复制准确的行为(包括将结果转换为承诺以及不监视API更新(*))
(*)注意:我不确定Observables是否一直调用API来检查新数据,但这不是我问题的重点,我只是想确保这种行为不会发生。我希望它能满足您的要求(未尝试):
makePostRequest(requestUrl:string,requestBody:any,requestOptions?:requestOptions):Promise我找到的解决方案(右链+导入):
我的做法有点不同。我的逻辑依赖于承诺被返回,并且执行。超时会导致它立即失败,而不管超时的持续时间如何
我的解决方案是创建一个新的承诺,而不是使用toPromise
:
const timeoutims=3000;
const request=this.\u http
.post(/*…*/)
.超时(timeoutims);
返回新承诺((解决、拒绝)=>{
要求
.采取(1)
.订阅(
数据=>解析(数据),
错误=>拒绝(错误),
);
});
如果您经常使用它,您可以将其重构为一个函数(尚未测试):
const-toPromiseWithTimeout=(obs:Observable,ms):Promise=>
新承诺((解决、拒绝)=>{
obs
.超时(毫秒)
.采取(1)
.订阅(
数据=>解析(数据),
错误=>拒绝(错误),
);
});
使用它:
const timeoutims=3000;
const request=this.\u http
。职位(/*…*/);
返回toPromiseWithTimeout(请求,timeoutims);
已经试过了。显然,超时仅由Observices支持,这不起作用?这里解释了如何使承诺超时,我不知道如何在您的案例中使用它,因为您没有创建承诺
。您需要执行类似于返回新承诺((解析,拒绝)=>{http.post().subscribe(…解析(),error=>reject())})
我不记得在这种特定情况下的确切错误,但我记得原因:超时仅在可观察的链中有效,没有承诺。我将在接下来的几天进行其他尝试。现在我将投票支持这项努力:)我找到了一个解决方案(我回答了我自己的问题)。你的回答几乎是正确的。但正确的频率是首先映射,然后是toPromise,最后是catch,注意导入必要的rxjs操作符。
makePostRequest(requestUrl:string, requestBody: any, requestOptions?: RequestOptions): Promise<any> {
requestOptions = requestOptions || new RequestOptions({ headers: this._defaultHeaders });
return this._http.post(requestUrl, JSON.stringify(requestBody), requestOptions)
.toPromise()
.then(this.extractData)
.catch(this.handleError)
}
makePostRequest(requestUrl:string, requestBody: any, requestOptions?: RequestOptions): Promise<any> {
requestOptions = requestOptions || new RequestOptions({ headers: this._defaultHeaders });
return this._http.post(requestUrl, JSON.stringify(requestBody), requestOptions)
.timeout(3000, new Error('timeout exceeded'))
.toPromise()
.then(this.extractData)
.catch(this.handleError)
}
// ! must import these
...
import 'rxjs/add/observable/throw';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/toPromise';
return this._http.get(requestUrl, requestOptions)
.timeout(5000, new Error( 'HTTP (GET) timeout for path: ' + requestUrl))
.map(this.extractData)
.toPromise()
.catch(this.handleError);