为什么存在“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
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