Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.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
Javascript Angular 2 Http可观测订阅回调函数_Javascript_Http_Angular_Callback - Fatal编程技术网

Javascript Angular 2 Http可观测订阅回调函数

Javascript Angular 2 Http可观测订阅回调函数,javascript,http,angular,callback,Javascript,Http,Angular,Callback,我对.subscribe函数有问题。 首先,我有一个向服务器发送请求的函数。就这样 protected sendRequest(data:string,url:string):Observable<any>{ let headers = new Headers({ 'Content-Type': 'application/x-www-form-urlencoded' }); let options = new RequestOptions({ headers: he

我对.subscribe函数有问题。 首先,我有一个向服务器发送请求的函数。就这样

protected sendRequest(data:string,url:string):Observable<any>{

    let headers = new Headers({ 'Content-Type': 'application/x-www-form-urlencoded' });
    let options = new RequestOptions({ headers: headers });

    //let body = 'email=' + 'email' + '&password=' + 'password';
    return this.http.post(url, data, options).map(response => response.json());
}
我得到一个错误:

EXCEPTION: TypeError: Cannot read property 'showModal' of undefined
我做错了什么?我将尝试将结果设置为类变量。为什么我在subscribe回调函数中调用的所有函数似乎都没有定义?
我会感谢你在这方面的帮助。谢谢。

正如Jason Goemaat已经提到的,您需要使用lambdas来访问类属性

在调试器中看不到它们的原因是,在传输的代码中,此被分配给了此。 你会看到一条线

var _this = this;
对于剩余的lambda
\u,将使用此
。这就是调试器不知道lambdas中的任何
变量的原因


例如,试试WebStorm。该IDE附带了一个调试器,该调试器可以意识到该问题并自动对其进行补偿。但是,它仅适用于chrome,因为它依赖于chrome附加组件。

当您使用“函数”时,它会在内部更改
的值。尝试使用lambda,即
data=>this.modal.showmodel('Login','Login')
调用showmodel方法确实有效。但是,如果我尝试使用响应数据设置变量
data=>this.result=data
,我仍然会在控制台中得到一个未定义的变量。为什么?为了进行调试,设置一个窗口变量并将其记录到控制台,您将在控制台中获得错误:
window['mythis']=this;console.log(this)在订阅之前尝试在函数中设置一个局部变量,并记录(或使用它),即
var self=this
然后在回调中
self.result=data我找到了问题所在。这是因为这是一个异步代码,如果在订阅之前记录了一个变量,那么代码将继续运行,并且只有在响应完成时才执行suces回调。但是,当执行订阅后的代码时,结果将是“未定义的”。多亏了你的建议和更多的研究,现在我知道是什么原因导致了这种情况。要知道的问题是:如何确保只有在数据已全部就绪的情况下才执行某些代码?我无法传递一个未定义的值,然后等待服务器响应。您需要在回调中执行该代码才能使用数据。如果您希望能够让其他组件或服务访问它,那么您可以创建自己的可观察对象并返回它,然后在回调中为该可观察对象提供一个值,该值将发送给任何订阅者。这似乎就是您使用
userService.login所做的。你能举一个更清楚的例子说明你想做什么但做不到吗?如果我使用lambda,它应该能正常工作?但即使在这种情况下,
data=>this.result=data
的代码也不起作用。我应该有权访问类属性。我不知道在那个特定的操作中发生了什么,如果我在订阅之外记录
this.result
,我仍然会得到未定义的错误。但现在我也可以使用modal和其他方法。这就是现在的问题。
this.userService.login(email, password).subscribe(
        function(data){
            this.modal.showModal('Login ','Login');
        }
    );
EXCEPTION: TypeError: Cannot read property 'showModal' of undefined
var _this = this;