@ Ответ Альнитака умный и помог мне стереть созданный мною хак, в котором я несколько искусственно разрешал обещание - независимо от базового результата - чтобы я мог использовать «когда» для пакетирования нескольких запросов и использования «готово», чтобы продолжить независимо от их успеха / неудачи.
Я «отвечаю» на ответ Альнитака в надежде на другое использование его предложения, которое поддерживает произвольное количество основных обещаний.
var asyncFunc, entity, entities, $deferred, $deferreds;
// ...
foreach (entity in entities) {
$deferred = $.Deferred();
$deferreds.push($deferred);
asyncFunc(entity).done(...).fail(...).always($deferred.resolve);
}
// ...
$.when.apply($, $deferreds).done(...)
Это псевдо-JavaScript, но он должен передать подход. Для некоторого набора сущностей произвольного размера создайте deferred ($ deferred) для каждой сущности и поместите его в массив ($ deferreds), сделайте асинхронный вызов, добавьте done / fail по желанию, но всегда включайте «всегда», которое разрешает это $ отсрочки. NB 'всегда' получает функцию разрешения отложенного, а не ее вызов.
Когда 'преобразует массив $ deferreds в список аргументов для' когда ', и, поскольку этот набор отложенных гарантированно разрешает (благодаря всегда), теперь можно определить' готово ', которое будет Вызывается, когда все асинхронные вызовы завершены независимо от того, успешны они или нет.