Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.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_Typescript - Fatal编程技术网

Javascript 控制程序流

Javascript 控制程序流,javascript,typescript,Javascript,Typescript,我有start(),只想在getCityInformation()完全完成后继续编写代码。控制台应打印('getCityInformation'=>'done'=>'finished')。我如何控制这个流程 async start() { await this.getCityInformation().then(() => console.log('done')); console.log('finished'); } async getCityInformation()

我有start(),只想在getCityInformation()完全完成后继续编写代码。控制台应打印('getCityInformation'=>'done'=>'finished')。我如何控制这个流程

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

您当前的
done
finished
getCityInformation
顺序是有意义的,因为在异步
getCityInformation()
中,您实际上会立即返回(例如,不要等待
什么)。这条链条是这样的:

  • start()
    调用
    getCityInformation()
  • getCityInformation()
    订阅一个可观察对象并返回
  • getCityInformation()
    现在完成,并且
    start()
    打印
    done
  • start()
    打印
    finished
  • getCityInformation()
    中的回调获取更新并打印
    getCityInformation
  • 要解决这个问题,您需要在
    getCityInformation()
    中等待,直到您准备好了可观察的对象。例如,您可以返回一个
    承诺
    ,当您拥有所需的所有数据时,该承诺就会实现

    你需要回报承诺等待结果
    getCityInformation
    函数


    它现在打印什么?它打印('done'=>'finished'=>'getCityInformation')这是因为getProductsByCategory()也是异步的。我想你也可以等着。或者,如果该方法返回承诺,则将该承诺作为getCityInformation方法的返回返回(即
    返回this.apiService.getProductsByCategory)(
    。。。etc@viiskis如果您在
    this.apiService.getProductsByCategory
    之前添加
    return
    关键字,会有帮助吗?您应该真正解释您的答案,而不仅仅是转储代码。您所做的更改可能并不明确,或者更重要的是,为什么要这样做。如果更改如此明显,OP可能就不知道了首先是这个问题。@ADyson,我认为代码是自我解释的,但我也会在这里写文章,这是其中的一半。你已经做了“什么”而不是“为什么”。只有当你对异步代码理解得很好时,这才是自明的。显然OP对此有点纠结。所以你也应该解释一下你建议背后的概念。
    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()
            );
    
        })    
    }