Javascript 角度等待第一个函数
在执行第二个函数之前,我需要等待第一个函数的结果 代码 第一功能Javascript 角度等待第一个函数,javascript,angular,typescript,ionic-framework,Javascript,Angular,Typescript,Ionic Framework,在执行第二个函数之前,我需要等待第一个函数的结果 代码 第一功能 getUser() { this.authService.user().subscribe( user => { this.user = user; console.log('current user 1: ', user); console.log('current user 2: ', this.user); } ); }
getUser() {
this.authService.user().subscribe(
user => {
this.user = user;
console.log('current user 1: ', user);
console.log('current user 2: ', this.user);
}
);
}
async ngOnInit() {
this.socket.fromEvent('message').subscribe(async (message: any) => {
if(this.user === undefined) {
// first function called
this.getUser();
// before it finish this console log will fire, therefore it returns `undefined`
console.log('this user: ', this.user);
} else {
//....
}
}
}
我需要保持控制台调用直到
this.getUser()代码>已完成怎么做?如果使用CombineTest
combineLatest(this.authService.user(), this.socket.fromEvent('message'))
.subscribe(([user, message]) => {
// Both message and user are available at the same time
});
如果您使用CombineTest
combineLatest(this.authService.user(), this.socket.fromEvent('message'))
.subscribe(([user, message]) => {
// Both message and user are available at the same time
});
你需要像下面一样使用use WAIT,我希望它能解决你的问题
async ngOnInit() {
this.socket.fromEvent('message').subscribe(async (message: any) => {
if(this.user === undefined) {
// first function called
await this.getUser();
// before it finish this console log will fire, therefore it returns `undefined`
console.log('this user: ', this.user);
} else {
//....
}
}}
你需要像下面一样使用use WAIT,我希望它能解决你的问题
async ngOnInit() {
this.socket.fromEvent('message').subscribe(async (message: any) => {
if(this.user === undefined) {
// first function called
await this.getUser();
// before it finish this console log will fire, therefore it returns `undefined`
console.log('this user: ', this.user);
} else {
//....
}
}}
您可以将getUser()方法转换为承诺。。像这样
getUser():Promise<any>{
return new Promise((resolve,reject) =>{
this.authService.user().toPromise().then(user => {
this.user = user;
console.log('current user 1: ', user);
console.log('current user 2: ', this.user);
resolve(user);
}).catch(err=> reject(err));
});
}
另外,尝试使用toPromise(),您只需要一次来自观察者的数据。。订阅一个观察者然后不取消订阅将导致内存泄漏。您可以将getUser()方法转换为承诺。。像这样
getUser():Promise<any>{
return new Promise((resolve,reject) =>{
this.authService.user().toPromise().then(user => {
this.user = user;
console.log('current user 1: ', user);
console.log('current user 2: ', this.user);
resolve(user);
}).catch(err=> reject(err));
});
}
另外,尝试使用toPromise(),您只需要一次来自观察者的数据。。订阅一个观察家,然后不取消订阅会导致内存泄漏。我认为不会,因为我的代码在ngOnInit
中,如果我按照你的方式执行,它会立即调用这两个选项,只有当我有套接字事件或我弄错了时,我才需要为用户调用?如果一个调用依赖于另一个调用,则可以使用switchMapthis.socket.fromEvent('message').pipe(switchMap(message=>functionthattreturnsanobserable(message)))
对不起,我在angular方面不是那么专业,这半段代码让我更加困惑:DMy的建议是,您还没有准备好开始学习angular,angular是基于RxJs构建的。停止学习Angular一两天,去熟悉RxJs。我希望有人在一开始就给我这个建议,因为如果我当时对RxJs有更多的了解,我几年前第一次编写的应用程序的结构会非常不同。是的,一开始它看起来很混乱,但它是异步开发在很长一段时间内最大的改进。是一个很棒的网站,它让很多概念在我看到它们的时候都点击了。我不这么认为,因为我的代码在ngOnInit
中,如果我按照你的方式去做,它会立即调用这两个,我只需要在我有socket事件或者我弄错了的情况下调用用户。如果一个调用依赖于另一个调用,你可以使用switchMapthis.socket.fromEvent('message').pipe(开关映射(message=>返回可观察(message))的函数)
对不起,我在angular方面不是那么专业,这半段代码让我更加困惑:DMy建议是你还没有准备好开始学习angular,angular是建立在RxJs基础上的。停止学习angular一两天,去熟悉RxJs。我希望有人在开始时给我这个建议,因为我几年前第一次写的应用程序如果我当时对RxJs了解得更多,go的结构会非常不同。是的,一开始它看起来很混乱,但它是异步开发在很长一段时间内的最大改进。是一个很棒的网站,它让许多概念在我看到它们时都会被点击。在构建完成后,我会让你知道resultgetUser不会重新发布rn任何东西,它都需要返回一个等待工作的承诺,因为Adrian提到它不会返回任何东西。谢谢,在构建完成后,我会让你知道resultgetUser不会返回任何东西,它需要返回一个等待工作的承诺,因为Adrian提到它不会返回任何东西。将承诺和RxJs混合在一起是许多人不赞成的。这没有错,b但包括我在内的许多人更愿意看到一个纯RxJs解决方案。将承诺和RxJs混合在一起是许多人不赞成的。这没有错,但包括我在内的许多人更愿意看到一个纯RxJs解决方案。