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

Is there a way to force a Deferred() to execute synchronously?

本文关键字:同步 执行 Deferred 有没有      更新时间:2023-09-26

代码中的其他地方有这样的内容:

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

你是对的。

我意识到这可能违背了承诺和延期

但是,您可以使用选项"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)。如果需要同步请求,请将此选项设置为false。跨域请求和数据类型:"jsonp"请求不支持同步操作。请注意,同步请求可能暂时锁定浏览器,在请求时禁用任何操作处于活动状态。从jQuery 1.8开始,在jqXHR中使用async:false($.Deferred)已弃用;您必须使用成功/错误/完成回调选项,而不是jqXHR的相应方法对象,如jqXHR.done()或不推荐使用的jqXHR.success().

试试这个:

getMyDeferred().done(nextStep);

所以,在阅读了人们的答案、评论并自己做了更多的研究之后,我最初问题的答案只是不,没有

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