我正在使用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片段是相当简单的,经过测试的代码。签名如下所示:
[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,而不是作为其他动作的一部分。
最佳答案
我想你要:
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);
您不能只将
.when()
留空当然,注释行永远不会挂起,您是说什么都没做完,然后再做....所以,它永远不会发生
关于javascript - $ .deferred()链中的第一个ajax调用永远不会到达那里,但是第二次单击按钮可以正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27479455/