У меня есть контроллер, где я могу разрешить все, кроме одной функции (позвольте ей thisOneFunction()) запускать асинхронно. Причиной этого является то, что OneFunction() полагается на примерно 10 обещаний, которые были разрешены, иначе у него нет данных в области, которую он должен выполнить.
Я видел несколько примеров онлайн о том, как вы можете специально ухватить обещание отдельных запросов/запросов/услуг, но то, что я не видел, - это способ проверить, что все обещания сразу были решены - возможно, благодаря переменной углового состояния, которая Я просто не знаю? Что-то вроде:
var currentPromises = $state.promises;
currentPromises.then(thatOneFunction());
Или, если еще нет встроенной переменной, есть способ динамически генерировать список всех обещаний, выдающихся в текущий момент, которые я могу использовать.then()? Это очень помогло бы, потому что у меня будет много страниц в этом приложении, у которых есть эта структура.
То, что я пробовал/в настоящее время выполняю "Сейчас у меня есть работа, но для этого требуется некоторая жесткая кодировка, которую я бы предпочел не продолжать. Она основана на вставке вызова функции, которая проверяет счетчик, сколько раз это функция была вычислена, сравнивает ее с тем, сколько обещаний должно было вызывать эту функцию уже (жестко запрограммировано после подсчета обещаний в контроллере), и если она уже прошла все необходимые обещания, она вызывает thisOneFunction().
Спасибо за любую помощь/указатели.
Пример бит моего кода (реальные имена/переменные изменены):
контроллер
$scope.runAfterAllPromises = function() {
*code dependedent on all promises here*
}
MySvc.loadList(function (results) {
$scope.myList = results;
});
$scope.runAfterAllPromises();
обслуживание
app.service("MySvc", ['$resource', function ($resource) {
this.loadList = function (callBackFunction) {
var stateRes = $resource('/api/ListApi');
stateRes.query(function (ListResults) {
if (callBackFunction && typeof (callBackFunction) === 'function') {
callBackFunction(ListResults)
};
})
Вы можете связывать обещания, если это помогает?
так что-то вроде этого:
var promises = [];
promises.push(yourPromise1());
promises.push(yourPromise2());
promises.push(yourPromise3());
$q.all(promises).then(function(){ ...});
Это ты имеешь в виду?
Короткий ответ: Нет, такого объекта нет.
Теперь, как достичь того, чего вы хотите достичь:
var allPromise = $q.all([promise1, promise2, promiseN]);
allPromise.then(success).catch(error);
Изменение: после того, как ваш "Человек может мечтать о комментариях", я подумал добавить это:
Вы можете переопределить функцию $ q.defer и отследить все отложенные объекты и получить свои обещания.
Очевидно, это может иметь некоторые проблемы с отложенными созданными, но никогда не разрешенными и такими, но может быть самым простым способом для достижения желаемой функциональности. Если вы хотите пройти весь путь, вы можете посмотреть на угловые декораторы, которые обеспечивают функциональность для расширения угловых поставщиков