【问题标题】:How to use async/await in typescript如何在打字稿中使用异步/等待
【发布时间】:2016-03-19 02:23:27
【问题描述】:

我想从我的ThemeService 中调用一个http.get 方法,并使其尽可能“同步”,以便在它从调用中获得Theme 后它是连续的。我搜索了如何做到这一点,偶然发现了asyncawait。我试图实现这一点,但它并不完全奏效。我在代码中放了一些console.log(),这样我就可以看到什么是执行了,什么没有执行。 “IN ASYNC FUNCTION”和“AFTER ASYNC”被执行,但不是在我对ThemeService 的调用之后/中的那些。

因为我是 typescript 中 async/await 函数的新手,所以我不知道我写的内容是否糟糕,或者我想要做的事情是否可行。

ngOnInit():void{
    let id = +this.routeParams.get('themeId');
    async function getTheme(){
        console.log("IN ASYNC FUNCTION");
        var val =  await this.themeService.getTheme(id).subscribe((theme:Theme)=> {
            this.theme = theme;
            console.log("IN AWAIT FUNCTION")
        });
        console.log("AFTER AWAIT");
        return val;
    }

    getTheme();
    console.log("AFTER ASYNC");
}

【问题讨论】:

    标签: asynchronous typescript async-await angular ecmascript-2016


    【解决方案1】:

    你可以这样(注意'take(1).toPromise()'的用法):

    ngOnInit():void
    {
        let id = +this.routeParams.get('themeId');
        async function getTheme()
        {
            console.log("IN ASYNC FUNCTION");
            var val =  await this.themeService.getTheme(id).take(1).toPromise();
            console.log("AFTER AWAIT");
            return val;
        }
    
        this.theme = await getTheme();
        console.log("AFTER ASYNC");
    }
    

    或者更短一点:

    class MyComponent implements OnInit
    {
        async ngOnInit() 
        {
            let id = +this.routeParams.get('themeId');
            this.theme = await this.themeService.getTheme(id).take(1).toPromise();
            console.log("AFTER ASYNC");
        }
    }
    

    希望这会有所帮助。

    【讨论】:

    • 我尝试了两种方法,但都没有成功,this.theme 没有得到值。 “AFTER ASYNC”未记录在控制台中。如果我在getTheme() 方法中添加console.log("int method"),它也不会在控制台中记录它
    • 尝试首先用一些虚拟方法替换你的 themeService.getTheme() 异步方法,该方法只记录它何时被调用并返回类似 Promise.resolve() 的东西,看看它不是 themeService 的问题。
    • 我将getTheme 的内容更改为仅在控制台中记录一些内容并返回 Promise.resolve() 而不是 Observable 并且可以。但是如果我正常使用 getTheme 方法而不是在 async/await 中使用它,则它可以工作。
    • 好的。你能把getTheme的内容替换成类似:rx.Observable.just(123),看看它是否能工作。
    • 在我返回 Observable 后,他仍然显示日志,但是一旦我尝试使用“.take(1).toPromise()”获取 observable 的值,它就不会记录“A​​FTER同步”消息
    猜你喜欢
    • 2019-03-18
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 2017-05-11
    • 2016-10-20
    • 2020-12-22
    相关资源
    最近更新 更多