jquery 延迟的用例

Use case of 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
}

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

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

在您使用 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() 已经 return 的承诺,然后链接到它并 return 它。

注意:我还更改了您的代码以使用 .then(),因为这是 "standard" 的处理方式,并且已被 jQuery 支持。 jQuery 正在转向 jQuery 3.x 中更加符合标准的承诺实现,因此现在开​​始以这种方式编码是明智的。


如果您确实需要在 jQuery 1.x 或 2.x 中创建您自己的 promise,并且希望尽可能与 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)
    });
}

至于什么时候用什么with$.ajax(),生活有点扑朔迷离。 $.ajax() 支持无数种不同的方式来在完成或出现错误时收到通知。有作为参数传递的直接回调。有 .success()(现已弃用)。 .done() 类似 promise,但不是标准的。有.then()这几乎是标准的。

在我看来,使用一种且唯一的方法并使该方法成为 .then() 的标准承诺机制具有巨大的优势。这样一来,您就可以拥有使用 promises 进行异步操作的所有其他优势,包括:

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