问题 Angular 4:如何在subscribe中使用await / async


我可以诚实地说,角度等待/异步真的是一个很棒的东西,它减少了很多大括号,提高了可读性并防止了很多人为错误。然而,有一件事困扰了我很多。如何在subscribe中使用await / async。

让我们说吧

 @Injectable()
export class TableCom extends BaseCom {
  public subject = new Subject<any>();

}

TableCom是一个提供者,用作信号器组件和页面组件之间的通信器。

所以在页面组件构造函数中,它使用可观察主题从signalr组件接收新数据,如下所示。

constructor(protected nav: NavController,
        protected db: Storage,
        protected alert: AlertController,
        protected order: OrderData,
        protected translate: TranslateService,
        public navParams: NavParams,
        public toastCtrl: ToastController,
        private table_data: TableData,
        private load: LoadingController,
        private http: Http,
        private com_table: TableCom

    )
    {
        super(nav, db, alert, order, translate, undefined, false);
        this.previous_page = navParams.get('previous_page');
        this.subscribe_table = this.com_table.Receive().subscribe(res =>
        {
            await this.SaveTableAsync(res.data);
            this.ReadTableAsync();
        });
    }

问题是this.ReadTableAsync()基本上必须等待this.SaveTableAsync才能在开始之前完成。等待可以在这里实现吗?先谢谢你 !!


5686
2017-07-20 19:00


起源

async / await用于预期promises的地方 SaveTableAsync 回报承诺?和 await 只能在里面使用 async function() {...} - Max Wizard K
是。 SaveTableAsync包装基于承诺的离子存储。 - Steven Li


答案:


你需要的 async 将该函数标记为“async”的关键字:

this.subscribe_table = this.com_table.Receive().subscribe(async res => {
    await this.SaveTableAsync(res.data);
    this.ReadTableAsync();
});

10
2017-07-20 19:02



你可以扩展一下,如果方法是绑定怎么办?例如: .subscribe(this.SaveTableAsync(res.data).bind(this))你会在第一个之前放异步吗? this? - kbpontius
以来 await 本身并不感兴趣 this 但只能在方法/函数调用的返回值中(在大多数情况下会在哪里调用) await 用于返回a Promise),我看不到任何可能限制其位置的规则 this。你能详细说明你的疑惑吗? - ideaboxer
这很好地回答了它。我的目标是确定在哪种情况下是否需要采用不同的方法 .bind(this) 用来。在实践中,我不得不做一些看起来像这样的事情: .subscribe(await this.someMethod(parameter).bind(this))。只是想确保它与上面给出的答案一致,因为语法有点不同。 - kbpontius