我有以下代码使用回调进行异步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;
}
答案 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
});
}