我正在创建一个动态数组af ajax调用我需要执行。所以我做了类似的事情:
var requests = [];
if (weNeedCustomerData) {
var customerCallPromise = $.ajax(...);
requests.push(customerCallPromise);
}
if (weNeedOrdersData) {
var ordersCallPromise = $.ajax(...);
requests.push(ordersCallPromise);
}
if (weNeedSalesData) {
var salesCallPromise = $.ajax(...);
requests.push(salesCallPromise);
}
$.when.apply(null, requests).done(function (result1, result2, result3) {
...
});
只要我的所有“if”条件都是真的,它就能正常工作。我可以得到每次通话的结果。
但是我应该如何处理这样的情况,例如,第一个“if”语句是假的,我最终只有两个请求?我在“完成”方法中只有两个结果。
如果我不知道会有多少请求,我怎么能读出这些结果,所以我不知道“完成”函数会有多少参数?
答案 0 :(得分:2)
单独存储或处理结果:
var requests = [], customerData, ordersData, salesData;
if (weNeedCustomerData) {
var customerCallPromise = $.ajax(...).done(function(result){
customerData = result;
});
requests.push(customerCallPromise);
}
if (weNeedOrdersData) {
var ordersCallPromise = $.ajax(...).done(function(result){
ordersData = result;
});
requests.push(ordersCallPromise);
}
if (weNeedSalesData) {
var salesCallPromise = $.ajax(...).done(function(result){
salesData = result;
});
requests.push(salesCallPromise);
}
$.when.apply(null, requests).done(function () {
//Here you know all relevant requests are complete
if(customerData) {
//...
}
//etc
});
答案 1 :(得分:1)
嗯...我不确定我是否理解你的问题...但我认为你不知道有多少属性有.done()
回调函数(result1,result2,result3,...)因为你不知道打印了多少条件。
你可以使用cicle检查回调函数的属性,如:
var requests = [];
var _y = 0;
if (weNeedCustomerData) {
var customerCallPromise = $.ajax(...);
//i guess $.ajax() is sync not async for use this syntax and not put the request store inside of the success callback.
requests[_y] = customerCallPromise;
_y++;
}
if (weNeedOrdersData) {
var ordersCallPromise = $.ajax(...);
requests[_y] = customerCallPromise;
_y++;
}
if (weNeedSalesData) {
var salesCallPromise = $.ajax(...);
requests[_y] = customerCallPromise;
_y++;
}
$.when.apply(null, requests).done(function () {
if(arguments.lenght > 0){
for(var _k = 0; _k < arguments.lenght; k++){
//this log show you all arguments (result1,resut2,result3...ecc...) whitout you need to define all
console.log(arguments[_k]);
}
}
});
但是现在我对ajax以及你用于evalue请求的方式有些困惑,因为如果$ .ajax是异步的,那么脚本不会等待salesCallPromise评估......但也许只是我的偏执< /强> ...
:)我希望它可以提供帮助。
答案 2 :(得分:0)
1 /这是一个棘手的问题。您可以控制此代码的服务器端部分,您可以放置标记/标记,从中可以获得服务器端操作方法。在客户端(javascript)中,您可以切换此标志/标记。 2 /另一种方式可能更合适的是在When.js文档中看到如何处理这种情况https://github.com/cujojs/when
答案 3 :(得分:0)
另一种方法是不使用$ .when - 明确$ .ajax调用并处理相应的响应;)