为什么存在“rxjs/no-async-subscribe”? `subscribe` 中的 `async` 有什么问题

why `rxjs/no-async-subscribe` exists? What's wrong with `async` inside `subscribe`

eslint-rxjs 中有一条规则 rxjs/no-async-subscribe

禁止的模式是(async关键字被禁止):

of(42).subscribe(async () => console.log(value));

为什么这是一件坏事?

我在某处看到它是因为它不受支持,但我已经对其进行了测试并且它有效,我可以在回调函数中使用 await 并且它有效。

此规则试图 force/encourage 开发人员使用 rxjs 的运算符(例如,各种映射函数),而不是异步函数。通过这样做,取消和重试等可观察对象的功能将起作用,而它们不适用于异步函数。

这条规则最初来自rxjs-tslint-rules,后来被添加到eslint中进行匹配。如 this pull request 中所述,最初的理由是(强调):

A mistake I often see people less familiar with Rx make is doing async things in subscribe():

events.subscribe(async value => {
  const data = await fetchData(url, value)
  const moreData = await fetchMoreData(url2, data)
  displayData(moreData)
})

This is bad because it does not handle cancellation of the operations and is therefor prone to race conditions. Instead, it should be this:

events.pipe(
 switchMap(value => fetchData(url, value)),
 switchMap(value => fetchMoreData(url2, data)),
).subscribe(displayData)

This can be done by enforcing that the subscribe() observer functions return void