我有返回一个observable的服务,该服务向我的服务器发出一个http请求并获取数据。我想使用这些数据,但是我总是最终得到undefined
。有什么问题?
服务内容 :
@Injectable()
export class EventService {
constructor(private http: Http) { }
getEventList(): Observable<any>{
let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers: headers });
return this.http.get("http://localhost:9999/events/get", options)
.map((res)=> res.json())
.catch((err)=> err)
}
}
零件:
@Component({...})
export class EventComponent {
myEvents: any;
constructor( private es: EventService ) { }
ngOnInit(){
this.es.getEventList()
.subscribe((response)=>{
this.myEvents = response;
});
console.log(this.myEvents); //This prints undefined!
}
}
原因:
这undefined
是因为您正在执行异步操作。意味着完成该getEventList
方法将需要一些时间(主要取决于您的网络速度)。
因此,让我们看一下http调用。
this.es.getEventList()
实际发出(“触发”)请求后,与您的http请求subscribe
将 等待
响应。等待期间,javascript将执行此代码下面的行,如果遇到同步分配/操作,它将立即执行它们。
因此,在订阅getEventList()
并等待响应后,
console.log(this.myEvents);
行将立即执行。而且它的值是undefined
在响应从服务器到达之前(或首先初始化的内容)。
类似于执行以下操作:
ngOnInit(){
setTimeout(()=>{
this.myEvents = response;
}, 5000);
console.log(this.myEvents); //This prints undefined!
}
解:
那么我们如何克服这个问题呢?我们将使用该
subscribe
方法的回调函数。因为当数据从服务器到达时,它将subscribe
在响应中。
因此,将代码更改为:
this.es.getEventList()
.subscribe((response)=>{
this.myEvents = response;
console.log(this.myEvents); //<-- not undefined anymore
});
会在一段时间后打印响应。
您应该做什么:
除了记录响应之外,您的响应可能还有很多事情要做。您应该subscribe
在数据到达时在回调函数(在函数内部)内执行所有这些操作。
要提到的另一件事是,如果您来自Promise
后台,则then
回调subscribe
与可观察对象相对应。
您不应该做的事情:
您不应该尝试将异步操作更改为同步操作(并非可以)。我们进行异步操作的原因之一是,在该时间段内用户可以执行其他操作时,不要让用户等待操作完成。假设您的一个异步操作需要3分钟才能完成,如果我们没有异步操作,该接口将冻结3分钟。
我有一个服务,返回一个可观察到的,做一个超文本传输协议请求到我的服务器,并获得数据。我想使用这些数据,但我总是最终得到。有什么问题? 服务: 组成部分: 我检查了如何从异步调用返回响应?发布,但找不到解决方案
问题内容: 我有一个发出Ajax请求的函数。我如何从中返回响应? 我尝试从回调中返回值,以及将响应分配给函数内部的局部变量并返回该局部变量,但这些方法均未真正返回响应。 问题答案: 问题 在一中的Ajax代表异步。这意味着发送请求(或更确切地说接收响应)已从正常执行流程中删除。在你的示例中,立即返回并且在调用;作为回调传递的函数之前执行下一条语句。 这是一个类比,希望可以使同步流和异步流之间的区别
问题内容: 我有一个发出异步请求的函数。我如何从中返回响应/结果? 我尝试从回调中返回值,以及将结果分配给函数内部的局部变量并返回该局部变量,但这些方法均未真正返回响应(它们都返回或变量的初始值为任意值) 。 使用jQuery函数的示例: 使用node.js的示例: 使用承诺块的示例: 问题答案: 在 一 中的Ajax代表 异步 。这意味着发送请求(或接收响应)已从正常执行流程中删除。在您的示例中
使用promise的块的示例:
问题内容: 我有一个发送Ajax命令的系统,该命令返回一个带有功能的脚本块。将此数据正确插入DIV后,我希望能够调用此函数来执行所需的操作。 这可能吗? 问题答案: 我想以这种形式正确解释您的问题:“好的,我已经用完所有的Ajax东西了;我只想知道从那时起任何时候都可以调用插入到DIV中的JavaScript函数吗? ,也就是说,我不想在上下文中将其称为“回调返回”。 好的,如果您的意思是这样,那
我想我根本不理解角2的rxjs可观测物的概念。 我创建了一个可观察属性,其他人可以订阅该属性并获取http调用结果的数据。 如果我想发出另一个http请求,可能需要修改一些参数以提取一些新数据,该怎么办?我是否要用这个新的可观察物替换可观察物?这是否破坏了我的订阅组件与前一个可观察组件的订阅?