如何使用回调操作来自多个异步ajax异步调用的数据?

时间:2016-09-24 00:25:13

标签: javascript jquery ajax asynchronous callback

我有以下代码使用回调进行异步ajax调用。

我的第一个主要问题是当我使用回调函数setA,setB,...进行数据操作时,来自ajax调用的返回值并不总是存在,我结束对来自“dataFromAjax”的未识别变量的操作。有没有办法在setB中执行操作只有当我知道我在dataFromAjax ['firstCall']中有一些数据是由函数setA设置的时候?

第二个问题是有一种简化代码的方法,而不必为每个数据操作创建一个新的成功函数吗?

dataFromAjax = {};

function makeACall(url,successCallBack,errorCallback){
   $.ajax({ 
          type: 'GET', 
          async: true,
          url: url, 
          success: successCallBack,
          error: errorCallback
          });
}

makeACall(url,setA,errorAjax)
makeACall(url,setB,errorAjax)
makeACall(url,setC,errorAjax)
makeACall(url,setD,errorAjax)

function setA(ajaxData){
   dataFromAjax['firstCall'] = ajaxData;       
}

function setB(ajaxData){
  dataFromAjax['secondCall'] =  dataFromAjax['firstCall'] + ajaxData;       
}

function setC(ajaxData){
  dataFromAjax['thirdCall'] =  dataFromAjax['secondCall'] / ajaxData;       
}

2 个答案:

答案 0 :(得分:1)

您可以尝试使用$.when功能,这里是文档https://api.jquery.com/jquery.when/ 基本上你的代码在示例中看起来像:

$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) ).done(function( a1, a2 ) {
  // a1 and a2 are arguments resolved for the page1 and page2 ajax requests, respectively.
  // Each argument is an array with the following structure: [ data, statusText, jqXHR ]
  var data = a1[ 0 ] + a2[ 0 ]; // a1[ 0 ] = "Whip", a2[ 0 ] = " It"
  if ( /Whip It/.test( data ) ) {
    alert( "We got what we came for!" );
  }
});

在你的情况下(取决于你想要达到的目标)

$.when($ajax.(url), $.ajax(url), $.ajax(url), $.ajax(url)).then(success, error);

function success(a, b, c, d) { return (a+b)/c; }
function error() { /* error handling */ }    

答案 1 :(得分:0)

如果要检查对象中是否存在属性(使其更加一致)。

if (dataFromAjax.firstCall) {
  dataFromAjax.secondCall =  dataFromAjax.firstCall + ajaxData; 
}

我不确定我是否理解,但如果您不想为每个ajax调用单独成功回调,您可以设置默认值并删除参数。

function defaultSuccess(ajaxData) {
    // do what you want
}

function makeACall(url, errorCallback){
   $.ajax({ 
          type: 'GET', 
          async: true,
          url: url, 
          success: defaultSuccess,
          error: errorCallback
          });
}