javascript - jQuery同步异步请求按顺序

标签 javascript jquery asynchronous

我有想要同步执行的任务;但我不想卡住浏览器。可能有 1---N 个任务。

以下是同步版本。它按预期工作,但卡住了浏览器。

如何使用 jQuery 延迟对象按顺序执行这些任务而不锁定浏览器。

注意:我请求的服务器不允许同时发出 2 个请求。一旦请求按准确顺序完成,它们就需要一个接一个地运行。

<?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
    });
}

关于javascript - jQuery同步异步请求按顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31013721/

相关文章:

javascript - 这个新语法 gql`string` 是什么

javascript - 小数化成负数?

jquery - 在 div jquery 中选择一个类

python - 异步 : collecting results from an async function in an executor

javascript - 使用 jquery 使用 .on() 将事件附加到页面上的动态插入按钮

javascript - 尽管所有数据都正确传递,但 Redux 状态未更新

javascript - SO 风格的警报标题

javascript - 使用 jQuery 在父窗口和子弹出窗口之间传递数据

c# - 如何知道任务是否同步完成?

javascript - 我们可以有一个调度程序,您可以异步添加要执行的操作,但将按该顺序同步执行吗?