如何让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。
答案 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甚至有一个),但在开始下一个操作之前只是一个非阻塞延迟。