温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - Rxjs, understanding defer
rxjs

其他 - Rxjs,了解延迟

发布于 2020-04-12 10:13:40

我在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方法?它的行为将如何不同?

查看更多

提问者
Expert wanna be
被浏览
39
paulpdaniels 2016-08-04 23:17

很简单,因为Observables可以封装许多不同类型的源,而这些源不一定必须遵循该接口。有些人Promises总是喜欢热心竞争。

考虑:

var promise = $.get('https://www.google.com');

在这种情况下,诺言已经在连接任何处理程序之前已经执行。如果我们希望它的行为更像an,Observable那么我们需要某种方式 promise的创建推迟到有订阅为止。

因此,我们使用defer创建一个仅在Observable预订结果后才执行的块

Observable.defer(() => $.get('https://www.google.com'));

上面的内容Promise直到Observable获得订阅后才会创建,因此其行为将更加符合标准Observable接口。