如何使jquery提交刷新命令?

时间:2016-06-03 16:06:27

标签: jquery

如何让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。

1 个答案:

答案 0 :(得分:0)

如果我们假设您的CORS AJAX请求需要阻止(并且我不太了解CORS来规定它确实如此,但是如果您有一个支持我的链接&# 39;我喜欢看它,然后你需要一个非阻塞的控制结构

目前,您的控制结构与此大致相同(简化):

export default Relay.createContainer(Details, {
    fragments: {
        widget: () => Relay.QL`
            fragment on Widget {
                id,
            }
        `
        viewer: () => Relay.QL`
            fragment on Viewer {
                id,
            }
        `
    }
});

这里的问题(再次,如果我们假设上面的第一个语句)并不是操作本身是阻塞的,而是围绕它的控制结构(for (var j = 0; j < all_types.length; j++) { performLongBlockingOperation(); quicklyUpdateUI(); } 循环)也是阻止。也就是说,for循环没有什么固有的东西可以让系统在迭代之间做任何其他事情。

在Windows Forms应用程序中,这个问题已经无数次出现了。多年来的创可贴解决方案是调用for(或者那种性质的东西,它已经有一段时间了)明确告诉UI更新。我不知道JavaScript中的等价物,可能是因为问题更加罕见。

然而,我们仍然可以实现同样的目标。我们只需要一个非阻塞控制结构。而且,幸运的是,由于阻塞操作需要很长时间(每次迭代几秒),因此我们可以在一定程度上灵活地延迟事情而不会被注意到。

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

for

这里的想法是每个&#34;迭代&#34; &#34;循环&#34; (现在更多的是递归而不是循环)执行操作,然后调度下一个&#34;迭代&#34;半秒钟后。 (或任何你想要使用的任意时间,真的。)

循环的元素仍然存在。声明了var j = 0; performLongBlockingOperationWrapper(j); function performLongBlockingOperationWrapper(count) { if (count >= all_types.length) { return; } performLongBlockingOperation(); setTimeout(function () { performLongBlockingOperationWrapper(count + 1) }, 500); } ,有一个终止条件来检查j是否已到达终点并停止执行,j(或j在函数内部,或者其他你想要调用它)随每个&#34;迭代&#34;递增。所有这些真正改变的是我们在循环的每次迭代中引入了延迟。而不是人为阻塞延迟(相当于count,如果JavaScript甚至有一个),但在开始下一个操作之前只是一个非阻塞延迟。