jQuery按顺序同步异步请求
jQuery synchronous asynchronous requests in order
我有要同步执行的任务;但我不想冻结浏览器。可能有1--N个任务。
下面是同步版本。它按预期工作,但会冻结浏览器。
我如何使用jQuery延迟对象来完成这些任务,但不锁定浏览器。
注意:我请求的服务器不允许同时进行两次请求。一旦请求按正确的顺序完成,它们就需要一个接一个地运行。
<?php
for ($k = 0;$k<count($partial_transactions);$k++)
{
?>
$("#formCheckout_<?php echo $k; ?>").ajaxSubmit({
success:function(response)
{
var data = response.split("&");
var processed_data = [];
for(var i = 0; i < data.length; i++)
{
var m = data[i].split("=");
processed_data[m[0]] = m[1];
}
$("#please_wait").hide();
if (processed_data.CmdStatus != 'Approved')
{
var message = decodeURIComponent(message);
message = processed_data.TextResponse.replace(/'+/g, ' ');
toastr['error'](<?php echo json_encode(lang('sales_attempted_to_reverse_partial_transactions_failed_please_contact_support'));?>, <?php echo json_encode(lang('common_error')); ?>);
}
else
{
toastr['success'](<?php echo json_encode(lang('sales_partial_credit_card_transactions_voided')); ?>, <?php echo json_encode(lang('common_success')); ?>);
}
},
cache: true,
headers: false,
async: false
});
<?php
}
?>
试试这个:
var counter = 0;
// Build up an array of all forms that are to be submitted sequentially.
var forms = [
<?php
for ($k = 0;$k<count($partial_transactions);$k++){
if($k == 0){
echo "#formCheckout_{$k}";
}else{
echo ", #formCheckout_{$k}";
}
}
?>
];
// Start the request
make_next_request(forms[counter]);
function make_next_request(form){
form.ajaxSubmit({
success:function(response)
{
var data = response.split("&");
var processed_data = [];
for(var i = 0; i < data.length; i++)
{
var m = data[i].split("=");
processed_data[m[0]] = m[1];
}
$("#please_wait").hide();
if (processed_data.CmdStatus != 'Approved')
{
var message = decodeURIComponent(message);
message = processed_data.TextResponse.replace(/'+/g, ' ');
toastr['error'](<?php echo json_encode(lang('sales_attempted_to_reverse_partial_transactions_failed_please_contact_support'));?>, <?php echo json_encode(lang('common_error')); ?>);
}
else
{
toastr['success'](<?php echo json_encode(lang('sales_partial_credit_card_transactions_voided')); ?>, <?php echo json_encode(lang('common_success')); ?>);
}
// Now chain request onto next form.
if(counter < forms.length){
counter++;
make_next_request(forms[counter]);
}
},
cache: true,
headers: false,
async: false
});
}
您可以将所有数据都放在一个处理所有数据的web工作程序中,这样UI线程就不会中断(但您必须向用户指示数据正在加载。)
有关更多信息,请参阅web工作者API,但基本上,web工作者是允许您进行多线程操作的本地浏览器对象。换句话说,当用户仍然与网页交互时,您的操作可以在后台运行,然后当操作完成时,它们可以通知UI线程(用户当前所在的线程)
您所说的这种CPU密集型数据加载似乎是这种API的完美用例。
我最终是这样做的。密集的部分是服务器端。所以我采纳了一些建议并提出了这个建议。(使用递归)
<script>
var num_transactions_to_void = <?php echo count($partial_transactions); ?>;
var max_index = num_transactions_to_void - 1;
if (num_transactions_to_void > 0)
{
void_sale_request(0);
}
function void_sale_request(index)
{
if (index > max_index)
{
return;
}
$("#formCheckout_"+index).ajaxSubmit({
success:function(response)
{
var data = response.split("&");
var processed_data = [];
for(var i = 0; i < data.length; i++)
{
var m = data[i].split("=");
processed_data[m[0]] = m[1];
}
$("#please_wait").hide();
if (processed_data.CmdStatus != 'Approved')
{
var message = decodeURIComponent(message);
message = processed_data.TextResponse.replace(/'+/g, ' ');
toastr['error'](<?php echo json_encode(lang('sales_attempted_to_reverse_partial_transactions_failed_please_contact_support'));?>, <?php echo json_encode(lang('common_error')); ?>);
}
else
{
toastr['success'](<?php echo json_encode(lang('sales_partial_credit_card_transactions_voided')); ?>, <?php echo json_encode(lang('common_success')); ?>);
}
void_sale_request(index + 1);
},
cache: true,
headers: false
});
}
</script>
相关文章:
- 如果需要登录,Angularjs$http拦截器会暂停异步请求
- RxJS异步请求更新
- Node js中间件,用于向mongo发出异步请求
- AJAX-如何在不冻结浏览器的情况下逐个发出异步请求
- 如何等待异步请求完成
- 为什么Chrome似乎异步请求Javascript文件
- 使用异步请求多个网址
- 在HTML中,可以在没有Ajax和/或Javascript的情况下创建异步请求
- 节点 JS 使用异步请求同步工作流
- 如何处理客户端节点上的异步请求
- 具有异步请求的 NodeJS
- 使用请求-承诺的嵌套异步请求
- 将数据从异步请求添加到 WebSQL 数据库时出错
- 使用 Jasmine 测试触发异步请求的方法
- 状态 = 0 的异步请求
- 在 Node.js 服务器内发出异步请求错误:“类型错误:对象 #<对象> 没有方法'_implicitHeader'”
- 如何使用 jquery ajax 向 PHP 页面发送异步请求
- 承诺解析错过异步请求循环的一个值
- 用于处理成功、失败、重试的异步请求的设计模式?(JavaScript)
- 如何处理对循环中发出的多个异步请求(AJAX 调用)的响应