如何让jquery submit刷新命令



如何让jquery提交刷新命令?

这条线路

$("#someDiv").append("pid: "+missing[i]+" guid:"+guid_key+" type: "+all_types[j]);

仅在提交功能完成时(即在整个提交功能结束时)更新someDiv

$("#target").submit(function() {
//Some code missing 
for (var i = 0; i < missing.length; i++) {
var guid_set_for_program = getGuids($("#vodsco_url").val() + "/getGuids/TitleVI/" + missing[i]);
//now we call each of those endpoints with the results of these guids
console.log(guid_set_for_program);
if (guid_set_for_program != null) {
for(guid_key of guid_set_for_program.keys()) {
for (var j = 0; j < all_types.length; j++) {
console.log(guid_key);
if(! isSuccess(makeAjaxCall($("#vodsco_url").val() + getUrlBySpecifier(all_types[j], guid_key, "TitleVI"), false))){
$("#someDiv").append("pid: "+missing[i]+" guid:"+guid_key+" type: "+all_types[j]);
appended_something = true;
console.log("FAILURE");
}
}
if(appended_something == false){
$("#regTitle").append("All vodscope lookups were successes.");
}
}
}
}
missing = [];
return false;
}, 0);

此呼叫需要10秒:

if(! isSuccess(makeAjaxCall($("#vodsco_url").val() + getUrlBySpecifier(all_types[j], guid_key, "TitleVI"), false))){

我正在进行同步呼叫,因为它们是CORS请求。我认为端点不支持jsonp,所以我必须使用特殊的头执行异步CORS请求。

每个请求调用可能需要10秒才能解决。因此,我希望在每个请求之间更新DOM。

如果我们假设您的CORS AJAX请求需要阻塞(我对CORS的了解还不够,无法规定它需要阻塞,但如果您有一个支持的链接,我很想看到它),那么您将需要一个非阻塞的控制结构

目前,您的控制结构大致相当于(简化):

for (var j = 0; j < all_types.length; j++) {
performLongBlockingOperation();
quicklyUpdateUI();
}

这里的问题(同样,如果我们假设上面的第一条语句)不是操作本身是阻塞的,而是它周围的控制结构(for循环)也是阻塞的。也就是说,for循环没有任何固有的东西允许系统在迭代之间做任何其他事情。

这个问题在Windows窗体应用程序中已经出现过无数次了。多年来的band-aid解决方案是调用DoEvents()(或者类似的东西,已经有一段时间了),它明确地"告诉"UI更新。我不知道JavaScript中有什么等效的,可能是因为这个问题相当罕见。

然而,我们可能仍然能够实现同样的目标。我们只需要一个非阻塞控制结构。幸运的是,由于阻塞操作需要很长的时间(每次迭代几秒钟),我们在延迟时间方面有一定的灵活性,不会被注意到。

假设不是在for循环上迭代,而是递归地调度这些操作。每一个都是前一个的回调,因此循环顺序得以保留,但允许我们在操作之间引入一些非阻塞时间。也许是这样的:

var j = 0;
performLongBlockingOperationWrapper(j);
function performLongBlockingOperationWrapper(count) {
if (count >= all_types.length) {
return;
}
performLongBlockingOperation();
setTimeout(function () {
performLongBlockingOperationWrapper(count + 1)
}, 500);
}

这里的想法是,"循环"的每个"迭代"(现在更像是递归,而不是循环)都会执行操作,然后在半秒钟后调度下一次"迭代"。(或者你想使用的任意时间,真的。)

循环的元素仍然存在。如果声明了j,则有一个终止条件来检查j是否已到达末尾并停止执行,并且j(或函数中的count,或您想调用它的任何函数)随每次"迭代"而递增。真正改变的是,我们在循环的每次迭代中都引入了延迟。不是人为的阻塞延迟(相当于Thread.Sleep(),如果JavaScript有的话),而是在开始下一个操作之前的非阻塞延迟。

最新更新