【问题标题】:Is there a way to force a Deferred() to execute synchronously?有没有办法强制 Deferred() 同步执行?
【发布时间】:2014-10-22 23:43:05
【问题描述】:

代码中的其他地方是这样的:

function getMyDeferred() {
    var deferred = $.Deferred();
    $.ajax(url, {
        success: function(data) {
            deferred.resolve(data);
        }
    });
    return deferred;
}

在我的代码中,我正在访问此方法并获取一个 Deferred 对象。有没有办法强制它在当前行等待,直到延迟完成?我意识到这可能违背了承诺和延迟的整个哲学,但我能做到吗?像这样的:

var deferred = getMyDeferred();

// do something here to ensure we do not proceed to the
// next step until deferred has been resolved

nextStep();

【问题讨论】:

  • 只使用同步 ajax 代替? Ofc 这是不好的做法,不推荐,但如果这是你想要的..
  • Fabricio 出于所有意图和目的,假设我无权更改有关第一个代码块的任何内容。我只有第二个。我实际上在做的是单元测试,所以我需要它等待响应才能对响应做任何事情。
  • 哦,我明白了。大多数单元测试框架都允许异步测试。
  • .then() 中包含太多样板代码了吗?这是使用 Promise 的普遍接受的方式。
  • 我认为你可以调用 defer.done(nextStep);.

标签: javascript jquery jquery-deferred


【解决方案1】:

你是对的。

我意识到这可能与整个哲学背道而驰 承诺和延期

但是,您可以使用“async:false”选项。

function getMyDeferred() {
    var deferred = $.Deferred();
    $.ajax(url, {
        async: false,
        success: function(data) {
            deferred.resolve(data);
        }
    });
    return deferred;
}

通过 jQuery 文档 (http://api.jquery.com/jquery.ajax/)

默认情况下,所有请求都是异步发送的(即设置为 默认情况下为真)。如果您需要同步请求,请将此选项设置为 错误的。跨域请求和 dataType: "jsonp" 请求不 支持同步操作。请注意,同步请求可能 暂时锁定浏览器,在请求期间禁用任何操作 活跃。从 jQuery 1.8 开始,使用 async: false 和 jqXHR ($.Deferred) 已弃用;您必须使用成功/错误/完成 回调选项而不是jqXHR的相应方法 对象,例如 jqXHR.done() 或已弃用的 jqXHR.success()。

【讨论】:

  • 请参阅我上面的评论,说明出于所有意图和目的,我无权修改该 Ajax 调用。
【解决方案2】:

试试这个:

getMyDeferred().done(nextStep);

【讨论】:

  • 这里使用$.when() 的理由为零。你可以使用deferred.done()
【解决方案3】:

因此,在阅读了人们的答案、cmets 并自己进行了更多研究之后,我最初的问题的答案只是不,没有

我最欣赏 Fabrício Matté 的 cmets,它向我指出了一些我乍一看没有注意到的事情:我使用的单元测试框架已经内置了用于异步测试的选项,所以我没有不需要做我在这里概述的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-28
    • 2018-02-25
    • 2022-10-06
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 2017-12-01
    • 2022-11-02
    相关资源
    最近更新 更多