Но при печати console.log(баланс) он не предоставляет мне действительный массив баланса json.
Это странная вещь $.when
. Он не предоставляет вам массив, но вызывает ваш обратный вызов с несколькими аргументами.
Другая проблема заключается в том, что если какой-либо из моих ajax-вызовов в calculateApiBalances() терпит неудачу, он не печатает All Done.
Да, потому что, когда одно обещание терпит неудачу, все обещание $.when()
немедленно отклоняется, и у вас нет никакого обработчика ошибок. Вам придется отлавливать ошибки по отдельности, если вы хотите всегда получать массив (возможно, неверных ответов). См. также $.Deferred: как определить, когда каждое обещание выполнено.
Что нужно сделать в приведенном выше коде, чтобы добиться этого.
Прежде всего, избегайте отложенного антишаблона :-)
$(window).load(function() {
getApiModemList().then(calculateApiBalances).then(function() {
var balance = Array.prototype.slice.call(arguments);
console.log(balance);
console.log("All Done");
});
});
function getApiModemList() {
return $.getJSON(somurl).then(function(res) {
return res.data;
});
}
function calculateApiBalances(vendors) {
return $.when.apply($, $.map(vendors, function(v, k) {
return $.getJSON(someurl).then(null, $.when);
}));
}
EDIT by Roamer:
А вот вариант основной процедуры с механизмом суммирования балансов.
getApiModemList().then(calculateApiBalances).then(function() {
var sumOfBalances = Array.prototype.reduce.call(arguments, function(tot, obj) {
return tot + (+obj.balance || 0);
}, 0);
console.log(sumOfBalances);
console.log("All Done");
});
obj
— это объект, обещанный $.getJSON(someurl)
в calculateApiBalances()
. В случае ошибки $.getJSON()
obj
будет объектом jqXHR, obj.balance
будет undefined
и +obj.balance
будет NaN
, поэтому по умолчанию добавляется ноль; в противном случае добавьте obj.balance
.
Если вы хотите узнать, сколько запросов getJSON были успешными, а сколько нет, вам нужно написать еще немного кода, но не так много.
person
Bergi
schedule
23.04.2015