有没有办法强制Deferred()同步执行?

时间:2014-10-22 23:43:05

标签: javascript jquery jquery-deferred

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

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();

3 个答案:

答案 0 :(得分:1)

试试这个:

getMyDeferred().done(nextStep);

答案 1 :(得分: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/

  

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

答案 2 :(得分:0)

因此,在阅读了人们的答案,评论以及自己做更多研究之后,我原来问题的答案就是不,没有

我最赞赏FabrícioMatté的评论,它向我指出了一些我刚看不到的东西:我正在使用的单元测试框架已经内置了异步测试选项,所以我不知道我需要做我在这里概述的内容。