Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.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

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
Angular 在发送HTTP请求之前执行条件方法 角度链Http请求_Angular_Http_Rxjs_Observable_Chain - Fatal编程技术网

Angular 在发送HTTP请求之前执行条件方法 角度链Http请求

Angular 在发送HTTP请求之前执行条件方法 角度链Http请求,angular,http,rxjs,observable,chain,Angular,Http,Rxjs,Observable,Chain,我创建了一个服务,在那里我包装了所有HTTP请求get、put、post get(url) { const headers = new Headers(); this.sessionToken(headers); // just add the headers... return this.http.get(url, { headers: headers }); } 在发送eg.GET请求之前,如何执行方法 在我的场景中,我有一个方法返回一个令牌,这个令牌需要保存在localSt

我创建了一个服务,在那里我包装了所有HTTP请求get、put、post

get(url) {
 const headers = new Headers();
 this.sessionToken(headers); // just add the headers...
 return this.http.get(url, {
   headers: headers
 });
}
在发送eg.GET请求之前,如何执行方法

在我的场景中,我有一个方法返回一个令牌,这个令牌需要保存在localStorage上,并按照链添加到头中

initClient() {
 return this.http.post('/connect/', {})
   .map(res => res.json())
}
如何在Http调用完成之前有条件地插入此请求

直接在该服务中,而不是在每次HTTP调用时订阅

下面是我试图做的:

get(url) {
 if (!localStorage.getItem('token')) {
  this.initClient()
    .subscribe(session => {
      localStorage.setItem('token', JSON.stringify(session));
    });
 }
const headers = new Headers();
this.sessionToken(headers);
 return this.http.get(url, {
  headers: headers
 });
}
但是,在调用initClient之前,HTTP请求已得到解决

我需要做什么

方法返回Http请求 在发送请求之前,获取令牌/设置令牌本地存储 继续Http请求,包括标头中的令牌 可能的解决方案-错误: @舒适的回答 类型为“session:any=>void”的参数不能分配给类型为“value:any,index:number=>observeInput”的参数。 类型“void”不可分配给类型“ObservableInput”

正在尝试将initClient{…}设置为任意类型: initClient:any{…}前面的错误消失,但出现另一个错误: ERROR TypeError:您在需要流的位置提供了“undefined”。您可以提供可观察的、承诺的、数组的或可观察的。

您需要的是可观察的。flatMap。flatMap的行为就像。然后在承诺中

另外,针对您的问题,您可以从Observable.if获得一些帮助,以使您的代码看起来更干净。Observable.ifcondition,thenSource,[elseSource]接受3个参数。第一个参数是布尔条件,第二个参数是条件为真时要发出的可观测值,最后一个参数是else源的数组,即条件为假时要发出的可观测值

大概是这样的:

get(url) {
    return Observable
        .if(
        //a function that returns a boolean
        () => !localStorage.getItem('token'),
        //an Observable to return if condition is true
        this.initClient()
            //use flatMap to proceed to next Observable
            .flatMap(session => {
                return localStorage.setItem('token', JSON.stringify(session));
            }),
        //an Observable to return if condition is false
        //return dummy value so that Observable can continue
        Observable.of('')
        )
        .flatMap(() => {
            const headers = new Headers();
            this.sessionToken(headers);
            return this.http.get(url, {
                headers: headers
            });
        })
}
现在,您可以在组件中调用geturl:

this.myService.get(API_URL)
    .subscribe(response => {
        console.log(response)
    });

flatMap mergeMap怎么样:我试图找到解决方案,但没能找到!可观察对象似乎被以下错误停止:error TypeError:您在预期流的位置提供了“undefined”。您可以提供一个可观察的、承诺的、数组的或可观察的。我将initClient设置为any类型,而initClient的flatMap开始抱怨:类型“void”不可分配给类型“ObservableInput”。我忘了说在下一次刷新时进行了调用,我得到了数据!你认为这是怎么回事?@39ro你的浏览器很可能正在缓存旧代码!非常感谢您的代码,这是一个可观察到的错误,我的浏览器似乎与我同在!:我重新启动了Angular CLI,还清理了本地存储@39ro如果它解决了您的问题,您可以将其标记为答案。