Javascript 有没有办法强制延迟()同步执行?
代码中的其他地方有这样一个:Javascript 有没有办法强制延迟()同步执行?,javascript,jquery,jquery-deferred,Javascript,Jquery,Jquery Deferred,代码中的其他地方有这样一个: function getMyDeferred() { var deferred = $.Deferred(); $.ajax(url, { success: function(data) { deferred.resolve(data); } }); return deferred; } 在我的代码中,我访问这个方法并得到一个延迟对象。有没有办法强迫它在当前行等待,直到延迟完成
function getMyDeferred() {
var deferred = $.Deferred();
$.ajax(url, {
success: function(data) {
deferred.resolve(data);
}
});
return deferred;
}
在我的代码中,我访问这个方法并得到一个延迟对象。有没有办法强迫它在当前行等待,直到延迟完成?我意识到这可能违背了承诺和尊重的整个哲学,但我能做到吗?大概是这样的:
var deferred = getMyDeferred();
// do something here to ensure we do not proceed to the
// next step until deferred has been resolved
nextStep();
试试这个:
getMyDeferred().done(nextStep);
你说得对
我意识到这可能违背了整个哲学
承诺和遵守
但是,您可以使用async:false选项
通过jQuery文档
默认情况下,所有请求都是异步发送的,即设置为
默认情况下为true。如果需要同步请求,请将此选项设置为
错误的跨域请求和数据类型:jsonp请求不会
支持同步操作。请注意,同步请求可能会
暂时锁定浏览器,禁用请求时的任何操作
它是活动的。从jQuery1.8开始,在jqXHR中使用async:false
$。已弃用延迟的;您必须使用success/error/complete命令
回调选项,而不是jqXHR的相应方法
对象,例如jqXHR.done或不推荐使用的jqXHR.success
因此,在阅读了人们的答案、评论,并亲自做了更多的研究之后,我最初的问题的答案是:不,没有
我最欣赏Fabricio Matté的评论,他向我指出了一些我一眼就没注意到的东西:我正在使用的单元测试框架已经为异步测试提供了内置选项,所以我不需要做我在这里概述的事情。只需使用同步ajax即可?Ofc这是一种不好的做法,不建议这样做,但如果这是您想要的..Fabricio,出于所有意图和目的,假设我无权更改关于第一个代码块的任何内容。我只有第二个。我实际上在做的是单元测试,所以我需要它等待一个响应,然后才能对这个响应做任何事情。哦,我明白了。不过,大多数单元测试框架都允许异步测试。是否正在包装代码。然后是太多的样板文件?这是处理承诺的普遍接受的方式。我想您可以调用defer.donenextStep;。请参阅我上面的评论,其中解释说,出于所有目的和目的,我无权修改那个Ajax调用。你可以用deferred.done。
function getMyDeferred() {
var deferred = $.Deferred();
$.ajax(url, {
async: false,
success: function(data) {
deferred.resolve(data);
}
});
return deferred;
}