Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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
Javascript 角度等待第一个函数_Javascript_Angular_Typescript_Ionic Framework - Fatal编程技术网

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
中,如果我按照你的方式执行,它会立即调用这两个选项,只有当我有套接字事件或我弄错了时,我才需要为用户调用?如果一个调用依赖于另一个调用,则可以使用switchMap
this.socket.fromEvent('message').pipe(switchMap(message=>functionthattreturnsanobserable(message)))
对不起,我在angular方面不是那么专业,这半段代码让我更加困惑:DMy的建议是,您还没有准备好开始学习angular,angular是基于RxJs构建的。停止学习Angular一两天,去熟悉RxJs。我希望有人在一开始就给我这个建议,因为如果我当时对RxJs有更多的了解,我几年前第一次编写的应用程序的结构会非常不同。是的,一开始它看起来很混乱,但它是异步开发在很长一段时间内最大的改进。是一个很棒的网站,它让很多概念在我看到它们的时候都点击了。我不这么认为,因为我的代码在
ngOnInit
中,如果我按照你的方式去做,它会立即调用这两个,我只需要在我有socket事件或者我弄错了的情况下调用用户。如果一个调用依赖于另一个调用,你可以使用switchMap
this.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解决方案。