是和否。
有些 observables 在构造上是有限的。例如,这包括所有 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");
});
在记录数组的内容后,这个 observable 将完成。按施工。
这是一个未完成的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" 永远不会被记录。始终,有限 observable 将显式调用其观察者的complete 或error 回调。没有任何 observables 可以通过任何类型的库魔法完成。
话虽如此,许多运营商都会为您完成这项工作。 RxJS#from 构造 Promises 和 Arrays 是有限的,但您可以使用(例如)take、takeWhile 等使 any 源有限。
但真的:没有
没有可以使 observable 有限的运行时标志或属性。唯一的方法是让 Observable 发出 error 或 complete。这是有道理的。即使您可以将 observable 标记为有限,观察者可以使用什么机制来知道 observable 何时完成了其完成义务?