控制程序流程

时间:2018-11-28 11:01:34

标签: javascript typescript

我有start(),并且只希望在getCityInformation()完​​全完成之后才继续执行我的代码。控制台应打印(“ getCityInformation” =>“完成” =>“完成”)。如何控制此流程?

async start() {
    await this.getCityInformation().then(() => console.log('done'));
    console.log('finished');
}

async getCityInformation() {
    this.apiService.getProductsByCategory(this.city.CategoryID)
        .subscribe((data: Product[]) => {
            console.log('getCityInformation')
            this.products = data;
        },
            (err) => console.log(err),
            () => this.loadActivities()
        );
}

2 个答案:

答案 0 :(得分:3)

您当前的Array<MerchantList>>donefinished的顺序很有意义,因为在异步getCityInformation中,您实际上立即返回了(例如,{{1} } 为了某件事)。连锁店就这样了:

  1. getCityInformation()呼叫await
  2. start()订阅一个可观察对象并返回
  3. getCityInformation()现在已完成,getCityInformation()打印getCityInformation()
  4. start()打印done
  5. start()中的回调获取更新并输出finished

要解决此问题,您需要在getCityInformation()中等待,直到您准备好观察到的东西为止。例如,您可以返回getCityInformation,当您拥有所需的所有数据时就可以满足。

答案 1 :(得分:1)

  

您需要返回promise等待结果   getCityInformation功能

async start() {
    await this.getCityInformation().then(() => console.log('done'));
    console.log('finished');
}

async getCityInformation() {
    return new Promise((resolve, reject) => {
        this.apiService.getProductsByCategory(this.city.CategoryID)
        .subscribe((data: Product[]) => {
            console.log('getCityInformation')
            this.products = data;
            resolve(data) 
        },
            (err) => reject(err) ,
            () => this.loadActivities()
        );

    })    
}