为什么存在"rxjs/no-async-subscribe"?"订阅"中的"异步"有什么问题



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 来实现

最新更新