Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在使用HTTP+;toPromise()?_Http_Angular - Fatal编程技术网

如何在使用HTTP+;toPromise()?

如何在使用HTTP+;toPromise()?,http,angular,Http,Angular,我发现建议的解决方案是使用可观察对象来设置http请求的超时 然而,我的代码的结构主要是使用承诺(在我希望数据自动更新的地方,我使用可观察的,而不是API调用的情况) 以下是我的代码(灵感来自Angular 2教程): makePostRequest(requestUrl:string,requestBody:any,requestOptions?:requestOptions):承诺{ requestOptions=requestOptions | | newrequestoptions({h

我发现建议的解决方案是使用可观察对象来设置http请求的超时

然而,我的代码的结构主要是使用承诺(在我希望数据自动更新的地方,我使用可观察的,而不是API调用的情况)

以下是我的代码(灵感来自Angular 2教程):

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