考虑以下几点:
// Defining a function
const addTwoNumbers = a => b => () => {
console.log(`Adding ${a} + ${b}`);
return a + b;
}
// Defining another function
const increment = addTwoNumbers(1);
// Defining another function
const incFive = increment(5);
// Invoking the final function to get a result
const result = incFive();
// Result is 6
console.log(`Result is ${result}`);
// Invoke 3 more times
[incFive, incFive, incFive].forEach(
fn => fn()
);
注意到每次调用incFive 时我们是如何运行代码1 + 5 的吗?如果你运行这段代码,你会看到
Adding 1 + 5
Result is 6
Adding 1 + 5
Adding 1 + 5
Adding 1 + 5
尽管函数只定义了一次,但函数中的代码总共“运行”了 4 次。
这就是 observables 的工作原理! subscribe 说运行 observable,所以如果你订阅 10 次,你运行 observable 10 次。
当然,如果你正在处理一个“热”的 observable,这会有所改变。使用concat 重复一个监听按钮舔的可观察对象(例如)没有多大意义。然而,使用concat 从服务器请求更新更有意义。
定义一个 observable 一次并能够重用它是很好的。上面,“invoke 3 more times”下面的行可以重写为:
// Redefine 3 more times
[addTwoNumbers(1)(5),addTwoNumbers(1)(5), addTwoNumbers(1)(5)].forEach(
fn => fn()
);
但这很麻烦!此外,有时您想在一个地方定义一个函数并在另一个地方完全调用它。到那时,您可能不知道如何重新定义它。可观察对象也是如此。