为什么$ .when()在函数完成时不等待?

时间:2016-04-01 09:41:56

标签: javascript jquery ajax deferred .when

我只想在功能" 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;
}

2 个答案:

答案 0 :(得分:2)

来自the documentation

  

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