ECMAScript 2017(ES8)实现Observable对象
Observable是ES7(ECMAScript 2016)提出的概念,它是异步编程中广泛使用的一种设计模式。Observable对象表示一个异步数据流,可以监听它的变化并对变化做出反应。Observable的使用可以使异步编程更加简单和优雅。
Observable的使用
Observable对象能够完成的任务远不止于Promise对象。Observable对象表示的是一个非常通用的数据源,其值会随着时间变化。Observable相比于Promise的好处之一在于它可以产生多个值,并且能够异步推送这些值。例如:
-- -------------------- ---- ------- ----- ---------- - --------------------------------------- - ----------------- ----------------- ----------------- ------------- -- - ----------------- -------------------- -- ------ --- ----------------- ------ ------------ ---------------------- ------- - ---------------- ----- - - --- -- ---------- - ------------------------ ----- --------- - - ----- -- ---------- - -------------------- - --- ----------------- ----- ------------
输出结果为:
just before subscribe got value 1 got value 2 got value 3 just after subscribe got value 4 done
Observable实现
在ES8中,Observable对象被正式纳入ECMA规范,并内置于Javascript中。Observable对象可以使用ES7提供的Symbol.observe方法来创建。在ES8标准中,Observable对象是一个类,它具有subscribe、unsubscribe、constructor等基本方法与属性。
以下是一个实现Observable对象的示例代码:
-- -------------------- ---- ------- ----- ---------- - ---------------------- - --------------- - ---------- - ------------------- - ------ -------------------------- - ------------- - -- -------- - ------ ---------------- - -- ---------------------------- - ------ ----- -------- --- - -- ---------------------- - -- ------- -
上述代码中的_subscribe方法代表着一个由开发者定义的观察者函数,它接收一个传入Observable对象的观察者。在内置的Observable对象之中,subscribe方法是被定义为一个内置装饰器:
let observable = new Observable(function subscribe(observer) { let intervalID = setInterval(() => { observer.next("hi"); }, 1000); return function unsubscribe() { clearInterval(intervalID); }; });
在这个例子中,subscribe返回了一个函数,它可以在调用时取消该Subscription,这样被订阅的Observable就不会再发送数据。
总结
Observable提供了一种简单的方法在异步编程中处理多个异步事件。Observable内置于ECMA标准中,通过内置的subscribe/next/error/complete方法,能够轻松的实现一个Observable对象。我们可以利用Observable不仅仅实现异步编程的任务,同时也可以实现其他多个观察者模式的功能。通过这个例子,我们可以初步了解Observable的基本概念及其如何实现。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64faac31f6b2d6eab3185fb8