Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.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 如何在angular2中执行回调?_Http_Angular - Fatal编程技术网

Http 如何在angular2中执行回调?

Http 如何在angular2中执行回调?,http,angular,Http,Angular,我在angular2服务中有以下代码: this.returned:string; parseResponse():void{ log(“响应:”,this.returned); } sendHttp(文本:字符串):无效{ var to_send=JSON.stringify({“text”:text}); var headers=新的headers(); headers.append('Content-Type','application/json'); 这是http .post('http

我在angular2服务中有以下代码:

this.returned:string;
parseResponse():void{
log(“响应:”,this.returned);
}
sendHttp(文本:字符串):无效{
var to_send=JSON.stringify({“text”:text});
var headers=新的headers();
headers.append('Content-Type','application/json');
这是http
.post('http://localhost:8080/', 
发送{
标题:标题
})
.map(res=>{
this.parseResponse()
})
.订阅(
函数(响应){console.log(“成功响应”+响应)},
函数(错误){console.log(“发生错误”+错误)},
函数(){parseResponse();}
);
}
但不幸的是,在nodejs服务器返回“testing”后,
parseResponse()
没有运行。但是,请求被正确接收。你能帮我吗

编辑: 这是实际代码。未记录任何内容。请求已发送。不执行回调

parseResponse(res: Response) : void {

 console.log("RESPONSE:",res);

 }

 sendHttp(text: string): void {

 var to_send = "sending";

 var headers = new Headers();
   headers.append('Content-Type', 'application/json');

 this.http
   .post('http://localhost:8080/', 
     to_send, {
       headers: headers
     })
   .map((res) => res.json() )
   .subscribe(
     (response) => { console.log("Success Response" + response)},
     (error) => { console.log("Error happened" + error)},
     () => { this.parseResponse(res); }
   );

}

您应该使用箭头函数,并在方法前面加上
this

.subscribe(
  (response) => { console.log("Success Response" + response)},
  (error) => { console.log("Error happened" + error)},
  () => { this.parseResponse(); }
);
通过这种方式,您将能够使用词法This(组件本身的实例)并引用/调用
parseResponse
方法

有关更多详细信息,请参阅此文档:

编辑


您需要知道,当HTTP请求中发生错误时(例如404),不会调用
map
操作符的回调。这与订阅时的完成回调相同。

您可能希望将响应传递给您的方法:

.map(res=>this.parseResponse(res))
或通过方法引用:

.map(此.parseResponse)
您的
parseResponse
方法还应返回“已解析”响应:

parseResponse(res:Response):任意{
让jsonRes=res.json();
log(“响应:”,jsonRes);
返回jsonRes;
}

您的意思是在第三次回调中没有调用该方法?该方法是否在
map
回调中调用?否。它不会在任何地方调用。您需要注意,当HTTP请求(例如404)中发生错误时,不会调用
map
操作符的回调。您的请求成功了吗?为什么parseResponse必须返回响应?为什么我不能在那里处理所有的事情呢?你不必按照sé返回响应,但是你想在订阅中得到的最后一个对象。在我建议的示例中,假设API返回JSON,那么您将返回反序列化的JSON字符串。这就是文档所说的:
映射操作符将您选择的函数应用于源可观测项发出的每个项,并返回一个可观测项,该可观测项发出这些函数应用程序的结果。
但是订阅和映射之间的区别是什么?我理解angular 2中的函数,但不理解它们的上下文。我应该在subscribe中放置什么?在
map
方法中,您可以执行反序列化和所有操作(通常只是
res.json()
),在
subscribe
方法中,您实际上是在检索数据流。从技术上讲,您已经可以将数据存储在
map
方法中的局部变量中,但无论如何您都必须调用
subscribe
来启动HTTP请求。在
onDone
回调中没有响应。但除此之外,你是否已经尝试过邮递员或小提琴手的请求,只是为了检查它是否真的返回了什么?