我只想在功能" removeDocx"被执行。 但在我的情况下,计时器的超时被视为完成"等待"功能。 问题在哪里,我该如何解决? 有一个代码示例:
$(function () {
$.when(wait()).done(function () {
location.href = location.href;
});
});
function wait() {
var pm = { ISN_DOC: GetrcId(document.location.href) };
if (isNaN(pm.ISN_DOC))
setTimeout(wait, 500);
else removeDocx();
}
function removeDocx() {
var def = $.Deferred();
var url = "MinPrj/Collage.asmx/clearPattern?isn_doc=" + pm.ISN_DOC;
$.ajax({
type: 'POST',
url: rootpath + url,
contentType: 'application/json'
}).done(function (r) {
def.resolve();
}).fail(def.reject());
return def;
}
答案 0 :(得分:2)
/descendant::p[@id][2]
的 deferreds 强>
类型:延期
零个或多个延迟对象或纯JavaScript对象。
您正在传递常规函数,而不是Deferred对象...
如果将单个参数传递给jQuery.when()并且它不是Deferred或Promise,则它将被视为已解决的Deferred,并且将立即执行任何附加的doneCallbacks。
答案 1 :(得分:1)
首先修复您的removeDocx
功能。 $.ajax
已经返回了一个延迟对象:
function removeDocx() {
var url = "MinPrj/Collage.asmx/clearPattern?isn_doc=" + pm.ISN_DOC;
return $.ajax({
type: 'POST',
url: rootpath + url,
contentType: 'application/json'
});
}
现在wait
函数也必须返回延迟(使其与$.when
一起使用)。问题是你必须在wait
的不同(伪递归)调用之间共享状态。这样的事情可能有用:
function wait(def) {
if (!def) {
var def = $.Deferred();
}
var pm = { ISN_DOC: GetrcId(document.location.href) };
if (isNaN(pm.ISN_DOC)) {
setTimeout(function() {
wait(def);
}, 500);
} else {
$.when(removeDocx()).then(def.resolve);
}
return def;
}
代码的其余部分保持原样,即你在没有args的情况下调用wait()
。