2017-07-06 18 views
0

我试图用多个其他Ajax请求中的数据发送数据。当调用sendDataOffAjax()时,问题出现了,没有实际的数据被发送,因为它在任何其他功能发生改变以添加数据之前就会关闭。我可以通过在任何地方使用asyn: false来轻松解决此问题,但从我阅读的内容来看,这是不好的做法。等到所有的Ajax完成处理在另一个Ajax内部,然后发送数据

这里是我的代码:

let requests = []; 
$.ajax({ 
    url: someUrl, 
    method: 'GET', 
    dataType: 'json', 
    complete: function (data) { 
     if (data.exists) { 
      if (condition) { 
       requests.push(anotherAjax()); 
      } 
      if (condition) { 
       requests.push(someDifferentAjax()); 
      } 
     } 
     requests.push(alwaysRunAjax()); 
    } 
}).done(function() { 
    $.when.apply($, requests).done(function() { 
     sendDataOffAjax(); 
    }); 
}); 

继承人的外观anotherAjax()像(其他所有的Ajax请求也这个样子):

function anotherAjax() { 
    return $.ajax({ 
     url: someUrl, 
     headers: { 
      'Accept': 'application/json', 
      'Content-Type': 'application/json' 
     }, 
     method: 'GET', 
     dataType: 'json', 
     complete: function (data) { 
      if (data.exists) { 
       toSendData.data['NEW_DATA'] = { 
        'data': data.responseJSON 
       } 
      } 
      //send complete signal? 
     } 
    }) 
} 

我怎么可能让它等到所有数据通过其他Ajax请求添加,然后启动sendDataOffAjax()

日志看起来是这样的:

Data sent 
anotherAjax Data added 
alwaysRunAjax Data added 
someDifferentAjax Data added 
+0

请勿使用'complete'或'done'。总是使用'然后'。 – Bergi

回答

0

当谈到Ajax请求,.complete(),根据jQuery的文档,成功或错误回调只运行后运行和.done()是与调用.success()。因此,考虑到这一点,您可以看到为什么完成回调中的代码首先运行。您应该能够将完整回调中的代码切换到已完成的回调,反之亦然,以获得理想的效果。

所以尝试:

let requests = []; 
$.ajax({ 
    url: someUrl, 
    method: 'GET', 
    dataType: 'json', 
    complete: function() { 
    $.when.apply($, requests).done(function() { 
     sendDataOffAjax(); 
    }); 
    } 
}).done(function (data) { 
    if (data) { 
    if (condition) { 
     requests.push(anotherAjax()); 
    } 
    if (condition) { 
     requests.push(someDifferentAjax()); 
    } 
} 
requests.push(alwaysRunAjax()); 
}); 

现在,只要你的所有的AJAX功能,您所呼叫回到这里推迟对象的请求阵列应该充满和$。当()应该等到全部递延对象解决。

+0

这很好,谢谢。 – Malpp

-2

没有这个是不可能的,没有async:false。 它不算作是一件好事情的原因是因为它违背了异步Ajax的思想。 async:false baisiclly将您的应用程序“锁定”到用户,直到您的请求完成,并且当您在同一时间将它放在过多的ajax调用上时,它会使您的请求看起来非常缓慢。 就你的情况而言,如果你将在2个函数上使用async:false,只要它们不需要很长时间就可以执行。

+0

我提到'async:false'只是说我不想使用它。我知道我可以让它与它一起工作。 – Malpp

相关问题