角等待第一个功能

时间:2020-06-25 04:25:28

标签: 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);
        }
    );
}

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();该怎么做?

3 个答案:

答案 0 :(得分:2)

您可以将getUser()方法转换为Promise。..

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));
   });
}

然后在您的ngOnInit()

async ngOnInit(){
  this.socket.fromEvent('message').subscribe((message: any) => {
    if(this.user === undefined) {
        // first function called
        await this.getUser().then(user=>{
           console.log('this user: ', user);
        });
    }
  });
}

另外,尝试使用toPromise(),在该情况下,您只需要从观察者获取一次数据即可。.订阅观察者,然后不取消订阅将导致内存泄漏。.

答案 1 :(得分:0)

如果您使用CombineLatest

combineLatest(this.authService.user(), this.socket.fromEvent('message'))
  .subscribe(([user, message]) => {
    // Both message and user are available at the same time
  });

答案 2 :(得分:0)

您需要像下面这样使用use await,希望它能解决您的问题

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 {
        //....
    }
}}