首先,我希望您检查一下:
load(){
return this._http.get(url)
.map(res => {
return res.json();
})
.map(data=>{
//some code
return {notifs,cpt};
});
}
export class HomePage {
notificationsList: Array<Notification> = [];
nonLu: number;
constructor(
private _userService: UserService,
private _router: Router,
public _notificationService: NotificationsService) {
_notificationService.load()
.subscribe(res => {
this.nonLu = res.cpt;
res.notifs.forEach((resObject) => {
this.notificationsList.unshift(resObject);
});
});
}
}
正如您在notification.service.ts文件中看到的那样,我有加载方法来加载特定用户的通知(为了更准确,该方法还返回通知和未读通知的数量)。
由于load方法返回一个Observable,我必须在home.component.ts中使用subscribe方法。在订阅方法中,我想分配属性&#34; nonLu&#34;一定的值(在这种情况下是res.cpt)。但是当我在subscribe方法中键入console.log(nonLu)时遇到问题,我有预期的值。否则,我得到了未定义。
我该怎么做才能解决这个问题?
谢谢
更新
constructor( private _userService: UserService, private _router: Router, public _notificationService: NotificationsService) {
_notificationService.load()
.subscribe(res => {
res.notifs.forEach((resObject) => {
this.notificationsList.unshift(resObject);
});
this.nonLu = res.cpt;
console.log("Inside subscribe : " + this.nonLu);
});
console.log("Outside subscribe : " + this.nonLu);
}
答案 0 :(得分:0)
Observables是异步的,这意味着传递给subscribe(...)
的回调最终会被执行但不会立即执行。 JavaScript(或TypeScript)继续使用下一个代码行执行
subscribe()
仅用于注册兴趣,以便在发出值时调用自己的代码。
constructor(
private _userService: UserService,
private _router: Router,
public _notificationService: NotificationsService) {
_notificationService.load()
.subscribe(res => {
this.nonLu = res.cpt;
res.notifs.forEach((resObject) => {
this.notificationsList.unshift(resObject);
});
/// code here is executed before the callback passed to subscribe
});
}
答案 1 :(得分:0)
正如冈特所说的那样。但作为一种解决方法,您可以使用setInterval
。虽然这不是最佳解决方案,但可以视为一种解决方法。
constructor( private _userService: UserService, private _router: Router, public _notificationService: NotificationsService) {
_notificationService.load()
.subscribe(res => {
res.notifs.forEach((resObject) => {
this.notificationsList.unshift(resObject);
});
this.nonLu = res.cpt;
console.log("Inside subscribe : " + this.nonLu);
});
let i=setInterval(()=>{
if(this.nonLu)
{
console.log(this.nonLu);
clearInterval(i);
}
},1000)
}