我对诺言很陌生,并且正在尝试确保我采用正确的方法。我的问题是,在将$.when
与$.ajax
的调用列表一起使用时,.done
中的$.when
是否等待执行,直到所有.done
所有$.ajax
通话都结束了吗?也许这段代码片段可以帮助解释这个问题:
var apiSoftFail = false;
var myCallback = function(jsonData) {
// lets say the json data returned by the ajax call contains a boolean
// indicator of whether or not the purpose for doing the api call was successful
if (jsonData.success) {
// do things with the jsonData returned
} else {
apiSoftFail = true;
}
};
var apiRequest = function(endpoint,callback) {
return $.ajax(
{'url':endpoint,'contentType': 'application/json'}
).done(function(data) {
callback(data)
});
};
$.when(
apiRequest("/apiEndpoint1",myCallback),
apiRequest("/apiEndpoint2",myCallback),
apiRequest("/apiEndpoint3",myCallback)
).done(function() {
if (apiSoftFail) {
// "API Soft Fail"
doThisFailureFunction();
} else {
doThisSuccessFunction();
}
}).fail(function() {
// "API Hard Fail"
doThisFailureFunction();
});
在此先感谢您提供的任何见解或建议,以寻求更好的方法。
答案 0 :(得分:-1)
是的,您的代码有一些问题。特别是,您需要给done
一个函数。
.done(function() {
if (apiSoftFail) {
// "API Soft Fail"
doThisFailureFunction();
} else {
doThisSuccessFunction();
}
}
您可以在此处检查:api调用都将首先调用它们自己的回调并输出其结果,然后在其后打印“成功”。
如果您多次运行此代码段,则会看到各个请求未按定义的顺序运行(某些请求有时会先于其他请求完成),但“成功”打印将始终排在最后。
var apiSoftFail = false;
var myCallback = function(jsonData) {
// lets say the json data returned by the ajax call contains a boolean
// indicator of whether or not the purpose for doing the api call was successful
if (jsonData) {
console.log(jsonData);
// do things with the jsonData returned
} else {
apiSoftFail = true;
}
};
var doThisFailureFunction = function() {
}
var doThisSuccessFunction = function() {
console.log("success");
}
var apiRequest = function(endpoint,callback) {
return $.ajax(
{url:endpoint,'contentType': 'application/json'}
).done(function(data) {
callback(data);
});
};
$.when(
apiRequest("https://jsonplaceholder.typicode.com/todos/1",myCallback),
apiRequest("https://jsonplaceholder.typicode.com/todos/2",myCallback),
apiRequest("https://jsonplaceholder.typicode.com/todos/3",myCallback)
).done(function() {
if (apiSoftFail) {
// "API Soft Fail"
doThisFailureFunction();
} else {
doThisSuccessFunction();
}
}).fail(
// "API Hard Fail"
doThisFailureFunction
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>