异步JavaScript - 回调VS递延/无极[复制](Asynchronous JavaScr

2019-07-17 18:48发布

可能重复:
什么是递延,并承诺在未来的JavaScript之间的区别是什么?

最近我一直在做,以提高我的JavaScript应用程序质量的努力。

我采用的一种模式是使用一个单独的“数据上下文”对象加载数据,我的应用程序(以前我是直接在我看来机型做这个)。

下面的示例返回在客户端上被初始化数据:

var mockData = (function($, undefined) {

    var fruit = [
        "apple",
        "orange",
        "banana",
        "pear"
        ];

    var getFruit = function() {
        return fruit;
    };

    return {
        getFruit: getFruit
    }
})(jQuery);

在大多数情况下,我们会从服务器加载数据,所以我们不能回到立即响应。 看来我对我们如何处理这个我们的API在两个选项:

  1. 使用回调
  2. 返回一个承诺 。

以前我一直用的回调方法:

var getFruit = function(onFruitReady) {
    onFruitReady(fruit);
};

// ...

var FruitModel = function(dataContext, $) {
    return {
        render: function() {
            dataContext.getFruit(function(fruit) {
                // do something with fruit
            });
        }
    };
};

不过,我可以看到它是如何可能的回调地狱结束,构建复杂的JavaScript应用程序时尤其如此。

然后,我遇到了承诺设计模式。 相反,需要调用者提供一个回调,我反而会返回一个可观察到一个“承诺”:

var getFruit = function() {
    return $.Deferred().resolve(fruit).promise();
};

// ...
dataContext.getFruit().then(function(fruit) {
    // do something with fruit
});

我可以看到使用这种模式的明显的好处,尤其是因为我可以wait多个递延对象初始化加载数据,单页的应用程序时,这可能是非常有用的。

不过,我希望了解每个模式的利弊开始之前,我无论是在愤怒中使用。 我也有兴趣在这是否是其他图书馆中去的方向。这似乎是与jQuery的情况。

这里有一个链接到我使用的用于测试的小提琴。

Answer 1:

承诺还依赖于幕后的回调,所以它不是一个真正有别于其它。

回调的好处是,他们很容易与普通的JavaScript(例如Ajax调用)来实现。

承诺需要额外的抽象层,这通常意味着你将依赖于一个库(不是一个问题,你的情况,你已经在使用jQuery)。 他们是完美的,当你处理多个并行异步调用。



Answer 2:

从阅读jQuery的文档是@Pointy的联系,它听起来就像不同的是,延迟API允许你指定一个以上的功能,您的请求完成时被调用:

在jQuery 1.5中,错误(故障),成功(完成),以及完整的(总是在jQuery 1.6)回调钩子先入先出管理的队列。 这意味着你可以为每个钩分配一个以上的回调。 见递延对象的方法,它在内部实现这些$。阿贾克斯()回调挂钩。

参见: deferred.then()



文章来源: Asynchronous JavaScript - Callbacks vs Deferred/Promise [duplicate]