$ .deferred()链中的第一个ajax调用永远不会到达那里,但第二次单击按钮工作正常

时间:2014-12-15 07:46:06

标签: javascript jquery ajax asp.net-mvc

我正在使用jQuery来设置一系列函数调用,其中两个是对ASP.NET MVC操作的ajax调用(在同一个控制器中)。通常,在第一次尝试时,第一个AJAX调用永远不会运行并且进程挂起。 Action中的断点永远不会被击中,加载对话框会永远显示它的漂亮面孔。

不具有相同功能(thisActionCanHangAjax)的不同代码路径似乎没有问题,但我不是100%。

我可以取消该过程(刷新页面,超时,关闭对话框)。我第二次点击按钮它会没有任何问题,并且按预期好又快。

我对使用延迟/承诺的jQuery很新,所以我希望有一些愚蠢的我在这里做错了(或者在控制器中,但这似乎不太可能)。

jQuery链和javascript看起来像这样

// <input type="button" onclick="fancySubmit()">Go Speed Racer Go</input>

function fancySubmit() {
    jQuery.when()
        .then(openLoadingBox)
        .then(thisActionCanHangAjax) // this one sometimes hangs/etc.  call doesn't reach MVC
        .then(getAdditionalDataAjax)
        .then(submitSimpleForm)
        .done(closeLoading) // modal('hide')
        .fail(showLoadingError);
}

function thisActionCanHangAjax() {
    // POSSIBLE ISSUES HERE?  this action returns JSON on success, but we don't care. 
    // any errors raise a 500 with custom message
    return $.post('@Url.Action("ThisActionCanHangAjax")', $("#basicForm").serialize());
}

function getAdditionalDataAjax() {
    return $.getJSON('@Url.Action("GetAdditionalDataAjax")');
}

function submitSimpleForm(jsonDataFrom_getAdditionalDataAjax) {
    // create form and append to body, post form, delete <form> element
    return true;
}

function openLoadingBox() {
    // MAYBE THE ISSUE IS HOW I AM DOING THIS ? 
    var dfd = new jQuery.Deferred(function () { $("#loading-dialog").modal('show'); });
    $("#loading-dialog").on('shown', function () { dfd.resolve(); });
    return dfd.promise();
}

ASP.NET MVC Pieces是非常简单,经过测试的代码。签名看起来像这样:

[HttpPost] public ActionResult ThisActionCanHangAjax(TheModel model)
{
    try { return new JsonNetResult(new { ok = true }); }
    catch (Exception e) { return new HttpStatusCodeResult(500, e.Message); }
}
[HttpGet] public ActionResult GetAdditionalDataAjax() {
    // just reads a bunch of basically static stuff, and returns it.
    return new JsonNetResult(new {name="Paula", level="Brillant" });
}

对于它的价值,我们没有办法在生产中调试服务器端,并且开发不是一个完美的再现(例如,我们没有一个巨大的IBM主机支持那里)因为事实该动作执行得很好/很快/经过充分测试,我不认为这是一个问题。我们只是一如既往地使用相同的功能,但是从AJAX开始,而不是作为另一个动作的一部分。

1 个答案:

答案 0 :(得分:1)

我想你想要:

 jQuery.when(openLoadingBox)
        .then(thisActionCanHangAjax) // this one sometimes hangs/etc.  call doesn't reach MVC
        .then(getAdditionalDataAjax)
        .then(submitSimpleForm)
        .done(closeLoading) // modal('hide')
        .fail(showLoadingError);

你不能像{/ 1>那样将.when()留空

当然,注释行永远不会发生并挂起,你说当什么都没有完成,然后这样做....所以,它永远不会发生