我是否必须将可观察对象显式定义为 "finite"?
Do I have to explicitly define an observable as "finite"?
有几种资源 (like this one) 定义了什么是“有限”可观察对象(最终停止发出值的可观察对象)。据我所读,人们普遍认为不需要取消订阅有限可观察量。
是否需要做任何事情才能将 Observable 明确定义为“有限”? This article 展示了 Angular HttpClient 在其 Observer
上调用 complete()
是如何迫使其观察者取消订阅的。这就是它“有限”的原因吗?或者一个 observable 是否可以在没有显式调用 complete()
的情况下就其性质而言是有限的?如果是这样,不取消订阅一个本质上是有限的可观察对象是否安全?
是也不是
一些可观察量在结构上是有限的。例如,这包括所有 Promise。它还包括
const someArray = [/* array contents */]
from(someArray).subscribe({
next: console.log, // Log emissions
error: _ => {}, // We could ignore errorsby omitting this line, but hey
complete: () => console.log("This observable completed");
});
记录数组内容后,此可观察对象将完成。通过建设。
这里是 from
的简化版本,未完成
function endlessFrom(array) {
return new Observable(observer => {
array.forEach(observer.next.bind(observer))
// observer.complete(); <- Oh no! ;)
return {
unsubscribe: () => {} // Do nothing
}
})
}
const someArray = [/* array contents */]
endlessFrom(someArray).subscribe({
next: console.log, // Log emissions
error: _ => {}, // We could ignore errorsby omitting this line, but hey
complete: () => console.log("This observable completed");
});
如果您 运行 这样做,您会看到 "This observable completed"
从未被记录。 finite observable 总是会调用其观察者的 complete
或 error
回调 显式 。没有可通过任何类型的任何库魔术完成的可观察对象。
话虽这么说,但许多运营商会为您完成这项工作。 RxJS#from
构造 Promise 和数组是有限的,但是您可以使用(例如)take
、takeWhile
等[=] 使 any 源有限21=]
但真的:没有
没有 运行 时间标志或 属性 可以使可观察到有限。唯一的方法是让 Observable 发出 error
或 complete
。这是有道理的。即使您可以将 observable 标记为有限的,观察者可以使用什么机制来了解 observable 何时已履行其完成义务?
有几种资源 (like this one) 定义了什么是“有限”可观察对象(最终停止发出值的可观察对象)。据我所读,人们普遍认为不需要取消订阅有限可观察量。
是否需要做任何事情才能将 Observable 明确定义为“有限”? This article 展示了 Angular HttpClient 在其 Observer
上调用 complete()
是如何迫使其观察者取消订阅的。这就是它“有限”的原因吗?或者一个 observable 是否可以在没有显式调用 complete()
的情况下就其性质而言是有限的?如果是这样,不取消订阅一个本质上是有限的可观察对象是否安全?
是也不是
一些可观察量在结构上是有限的。例如,这包括所有 Promise。它还包括
const someArray = [/* array contents */]
from(someArray).subscribe({
next: console.log, // Log emissions
error: _ => {}, // We could ignore errorsby omitting this line, but hey
complete: () => console.log("This observable completed");
});
记录数组内容后,此可观察对象将完成。通过建设。
这里是 from
的简化版本,未完成
function endlessFrom(array) {
return new Observable(observer => {
array.forEach(observer.next.bind(observer))
// observer.complete(); <- Oh no! ;)
return {
unsubscribe: () => {} // Do nothing
}
})
}
const someArray = [/* array contents */]
endlessFrom(someArray).subscribe({
next: console.log, // Log emissions
error: _ => {}, // We could ignore errorsby omitting this line, but hey
complete: () => console.log("This observable completed");
});
如果您 运行 这样做,您会看到 "This observable completed"
从未被记录。 finite observable 总是会调用其观察者的 complete
或 error
回调 显式 。没有可通过任何类型的任何库魔术完成的可观察对象。
话虽这么说,但许多运营商会为您完成这项工作。 RxJS#from
构造 Promise 和数组是有限的,但是您可以使用(例如)take
、takeWhile
等[=] 使 any 源有限21=]
但真的:没有
没有 运行 时间标志或 属性 可以使可观察到有限。唯一的方法是让 Observable 发出 error
或 complete
。这是有道理的。即使您可以将 observable 标记为有限的,观察者可以使用什么机制来了解 observable 何时已履行其完成义务?