Я использую jQuery для создания различных запросов POST ajax. Мне нужно отслеживать успех или неудачу каждого из них, а также общий прогресс всей партии, чтобы я мог обновить пользовательский интерфейс с индикатором выполнения и информацией о том, сколько запросов удалось, и сколько из них не удалось, из общей суммы.Отслеживание и прогресс различных запросов ajax post
Прежде чем пытаться реализовать функцию в своем приложении, я играл с некоторым кодом в jsfiddle в качестве доказательства концепции, пока не повезло. Это то, что я получил:
// an alternative to console.log to see the log in the web page
var fnLog = function(message) {
$('#console').append($("<p>" + message + "</p>"));
};
// keeping track of how many ajax calls have been finished (successfully or not)
var count = 0;
// a dummy ajax call that succeeds by default
var fn = function(shouldFail) {
return $.get(shouldFail ? '/echo/fail/' : '/echo/json/')
.done(function() { fnLog("done") })
.fail(function() { fnLog("FAIL") });
};
// a set of different asynchronous ajax calls
var calls = [fn(),fn(),fn(),fn(true),fn(),fn()];
// an attempt to make a collective promise out of all the calls above
$.when.apply($, calls)
.done(function() { fnLog("all done") })
.fail(function() { fnLog("ALL FAIL") })
.always(function() { fnLog("always") })
.progress(function(arg) { fnLog("progress" + arg) })
.then(function() { fnLog("finished") });
Это все в этой скрипке: http://jsfiddle.net/mmtbo7v6/1/
Что мне нужно, это способность обеспечить обратный вызов, который должен быть вызван после того, как все обещания будут решены (или успешно или не).
Когда все вышеперечисленные вызовы установлены на успешное выполнение (путем удаления аргумента true
четвертого вызова fn
в массиве), он отлично работает. Выходные печатает следующее:
done
done
done
done
done
done
all done
always
finished
Но когда даже один вызов устанавливается на провал (как по умолчанию в jsfiddle), выход заключается в следующем:
done
FAIL
ALL FAIL
always
done
done
done
done
Так ни один из коллективные обещания обратного вызова (тот, который генерируется вызовом $.when
) вызывается после того, как все обещания разрешены. Окончательный .then
не вызывается вообще, если один вызов ajax терпит неудачу.
Кроме того, я хотел бы получить некоторое представление о том, как отслеживать ход этой серии вызовов ajax, обновлять индикатор выполнения в пользовательском интерфейсе.
Большое спасибо @Benjamin. Я уже подозревал, что неотъемлемый способ выполнения обещаний не будет служить моей цели, но я не нашел способ его решить. Ваш ответ не только решает мою проблему, но и дает мне больше информации о том, как использовать '' .Deferred' для jQuery для моих собственных целей и для достижения пользовательского поведения, такого как тот, который мне нужен в этом конкретном случае. Еще раз спасибо. – Ernesto
Эй, @ Benjamin, я реализую часть прогресса этого, и я выкопал немного больше о способе выполнения jQuery, который, как вы говорите, считается уступающим. Мне интересно, почему, потому что на самом деле довольно просто интегрировать в код, который вы показываете выше, без необходимости передавать второй аргумент функции 'sett'. Затем, увеличив счетчик '' '' 'call', вы можете вызвать' d.notify (counter, promises.length) 'вместо своего собственного обратного вызова' progress'. Наконец, вы можете зарегистрировать обратные вызовы прогресса к возвращенному обещанию, и они будут вызваны всякий раз, когда вызывается 'd.notify'. – Ernesto