eslint-rxjs中有一条规则是rxjs/no-async-subscribe
禁止模式为(async
关键字被禁止(:
of(42).subscribe(async () => console.log(value));
为什么这是件坏事?
我在某些地方看到过这是因为它不受支持,但我已经测试过了,它可以工作,我可以在回调函数中使用await
,它也可以工作。
此规则试图强制/鼓励开发人员使用rxjs的运算符(例如,各种映射函数(,而不是异步函数。通过这样做,诸如取消和重试之类的可观察性特性将起作用,而异步函数则不会起作用。
这个规则最初来自rxjs-tslint规则,然后添加到eslint中进行匹配。正如本次撤回请求中所述,最初的理由是(强调部分增加(:
我经常看到不太熟悉Rx的人犯的一个错误是在subscribe((中做异步操作:
events.subscribe(async value => { const data = await fetchData(url, value) const moreData = await fetchMoreData(url2, data) displayData(moreData) })
这很糟糕,因为它不处理操作的取消因此容易出现竞争条件。相反,它应该是这样的:
events.pipe( switchMap(value => fetchData(url, value)), switchMap(value => fetchMoreData(url2, data)), ).subscribe(displayData)
这可以通过强制subscribe((observer函数返回void 来实现