我在Reactive中搜索了使用延迟,但是我仍然不明白为什么以及何时使用延迟方法。
据我了解,所有Observable方法在订阅之前不会被触发,那么,为什么我们需要用defer方法包装observable方法?
请给我建议,如果给我例子,将不胜感激。
[更新]
现在我明白了。
在反应式文档中,我看到了这个示例,
var source = Rx.Observable.defer(function () {
return Rx.Observable.return(42);
});
var subscription = source.subscribe(
function (x) { console.log('Next: ' + x); },
function (err) { console.log('Error: ' + err); },
function () { console.log('Completed'); } );
我很想知道
为什么用deffer包装了Observable方法?它的行为将如何不同?
很简单,因为Observables
可以封装许多不同类型的源,而这些源不一定必须遵循该接口。有些人Promises
总是喜欢热心竞争。
考虑:
var promise = $.get('https://www.google.com');
在这种情况下,诺言已经在连接任何处理程序之前已经执行。如果我们希望它的行为更像an,Observable
那么我们需要某种方式将 promise的创建推迟到有订阅为止。
因此,我们使用defer
创建一个仅在Observable
预订结果后才执行的块。
Observable.defer(() => $.get('https://www.google.com'));
上面的内容Promise
直到Observable
获得订阅后才会创建,因此其行为将更加符合标准Observable
接口。
@AlexPineda不确定您的意思。
defer
已经了解,Promises
因此它已经隐式处理了它们,因此fromPromise
除非您希望明确使用它,否则您将不需要。我认为他的意思是,如果您这样做
fromPromise(promise)
了,那么promise
被传递给的fromPromise
对象已经在执行,并且fromPromise
在Observable包装器中返回的只是承诺。通过使用defer
,直到我们订阅后,promise才会开始执行。