延迟

时间:2016-02-02 18:14:45

标签: jquery jquery-deferred

我正在阅读jquery中的Deferred方法。我知道它是如何工作的,但不知道何时使用它。就像简单的ajax函数一样,我可以使用.success方法进行回调

function customAjax() {
    $.ajax({
        type: 'GET',
        url: 'abc/blala'
    }).success(function () {
        //callback
    })
}

但我看到一些地方就像下面给出的例子一样。所以我不确定何时使用延期。

function customAjax() {
    var deferred = jQuery.Deferred();
    $.ajax({
        type: 'GET',
        url: 'abc/blala'
    }).success(function (reponse) {
        deferred.resolve(response);
    });
    return deferred.promise
}

2 个答案:

答案 0 :(得分:1)

延迟对象是用于获取异步操作结果的东西,以便您可以在应用程序的同步流中使用它,如果这有意义的话。任何异步获得的结果都不能立即返回;相反,它们将来某个时候可用。延迟对象允许您在可用时访问这些结果。

答案 1 :(得分:1)

承诺开发的一般趋势是不再使用Deferred对象或Deferred构造函数。事实上,承诺的ES6标准甚至不支持这样的事情,因为它根本不需要。总是有一种替代方法来编写不创建Deferred对象的东西。

在您使用customAjax方法的特定情况下,根本不需要它。相反,你可以这样做:

function customAjax() {
    return $.ajax({
        type: 'GET',
        url: 'abc/blala'
    }).then(function (result) {
        // process the result in any way here
        return processed result here
    });
}

customAjax().then(function(value) {
    // do something with value here
});

因此,在您的情况下,您无需创建自己的承诺。你可以使用$.ajax()已经返回的承诺,然后链接到它并返回它。

注意:我还将您的代码更改为使用.then(),因为这是"标准"做事的方式,已经得到了jQuery的支持。 jQuery正在转向jQuery 3.x中更加标准兼容的promise实现,所以现在开始编码是明智的。

如果您确实需要在jQuery 1.x或2.x中创建自己的承诺,并希望尽可能与ES6标准兼容,同时仍然使用jQuery支持的东西,您可以执行以下操作:

function delay(t) {
    return jQuery.Deferred(function(def) {
        setTimeout(function() {
            def.resolve();
        }, t)
    }).promise();
}

出于参考目的,ES6标准语法如下所示:

function delay(t) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            resolve();
        }, t)
    });
}

至于什么时候使用$.ajax(),生活有点令人困惑。 $.ajax()支持数十种不同的方式,可以在完成或出现错误时收到通知。有直接回调作为参数传递。有.success()(现已弃用)。那里的.done()是承诺的,但非标准的。那里的.then()几乎是标准的。

在我看来,使用one and only方法并使该方法成为.then()的标准承诺机制有很大的优势。这样就可以让您拥有使用promise进行异步操作的所有其他优点,包括:

  1. 将多个异步操作按顺序链接在一起的能力。
  2. 使用$.when()Promise.all()等内容协调多个异步操作的能力。
  3. 即使在异步操作中也会保持安全(这将需要jQuery 3.x中的ES6兼容承诺)。
  4. 显着增强了错误传播,即使是深度嵌套的异步操作也是如此。
  5. A"标准"编码异步操作的方法。