如何确定特定ajax调用的优先级?

时间:2019-05-14 09:13:00

标签: javascript ajax

我有两种基于Ajax的方法,每10秒执行一次。但是我还有另一件事是表单提交。现在,当我提交表单进行处理时,它将等待先前触发的ajax调用完成然后进行处理。我想优先考虑。

以下我有脚本

function refresh_ss_one(){
    $.ajax({
       type: 'GET',
       url: "{{ route('RefreshSessionOne') }}",
       data: {}, 
       success: function(response){ 
        console.log(response);
       }
    });
}
function refresh_ss_two(){
    $.ajax({
       type: 'GET',
       url: "{{ route('RefreshSessionTwo') }}",
       data: {}, 
       success: function(response){ 
        console.log(response);
       }
    });
}
setInterval(refresh_ss_one, 10000);
setInterval(refresh_ss_two, 10000);

我还有一个正在执行表单提交事件,我想对其进行优先排序。我已经遍历了async ajax参数并在我的ajax函数中使用过,但仍然遇到问题。

$("#check-rate").submit(function(e) {
    var form_data = $(this);
    $.ajax({
           type: 'POST',
           url: currency_route,
           data: form_data.serialize(), 
           success: function(response)
           {
              ...
           }
         });
    e.preventDefault(); 
});

有人可以指导我如何解决此问题。.

4 个答案:

答案 0 :(得分:0)

您可以通过以下方式尝试:

<script>
// write your ajax function like
$.ajax({
    type: 'GET',
    url: "{{ route('RefreshSessionOne') }}",
    data: {},
    async: false,
    success: function(response) {
        console.log(response);
    }
});

//首先完成此请求,然后输入其他代码

$.ajax({
    type: 'GET',
    url: "{{ route('RefreshSessionTwo') }}",
    data: {},
    success: function(response) {
        console.log(response);
    }
});

//在上一个async:false请求完成后执行。     

默认情况下,jquery中的$ .ajax请求设置为异步。变量名是async,并且值设置为true。

或者您可以在第一个函数的成功部分中调用第二个函数。

答案 1 :(得分:0)

我会尝试更现代的方法。遵守诺言:

var promise1 = new Promise(function(resolve, reject) {
   //first ajax call here
});

promise1.then((value) => {
//second ajax call here
});

这里是documentation

promise所要做的就是确保运行代码的第一部分(您的第一个ajax调用在这里,您可以设置成功执行ajax调用的resolve,然后它将运行第二个代码。

P.S。您可以根据需要拥有任意数量的

答案 2 :(得分:0)

顺序从GET / POST请求列表中获取响应,以下是使用jQuery Deferreds解决问题的方法

const $ajaxSeq = arr => $.when.apply($, arr.map(data => $.ajax(data))).then(function(_res){ 
     return Array.isArray(_res) ? [].map.call(arguments, res => res[0]) : [_res];
  });

用法如下:

$ajaxSeq([
    {type:'POST', url:'some_url_here', data: {content: "Hello world"}},
    {type:'GET',  url:'some_url_here'},
    {type:'GET',  url:'some_url_here'},
]).then( res => {
    // Once all requests are fulfilled
    // access the desired response in order:
    console.log(res[0])
    console.log(res[1])
    console.log(res[2])
});

答案 3 :(得分:-1)

AJAX调用可以做到。它使请求异步。因此,根据定义,一个请求不会等待另一个请求完成。您可以像上面@jayoti所说的那样将其设置为async:false。不仅如此,您还应该有一个方法方法来调用其他2个方法,并且在收到响应时可以调用第二个方法。