Вопрос:
Есть ли «простой» способ отменить ($q
-/$http
-) обещания в AngularJS или определить порядок, в котором обещания были разрешены?
Пример
У меня есть длительный расчет, и я запрашиваю результат через $http
. Некоторые действия или события требуют, чтобы я перезапустил вычисление (и, таким образом, отправил новый запрос $http
) до того, как исходное обещание будет разрешено. Таким образом, я думаю, что не могу использовать простую реализацию, например
$http.post().then(function(){
//apply data to view
})
потому что я не могу гарантировать, что ответы возвращаются в том порядке, в котором я отправлял запросы - в конце концов, я хочу показать результат последнего расчета, когда все промисы были разрешены правильно.
Однако я хотел бы избежать ожидания первого ответа, пока я не отправлю новый запрос, подобный этому:
const timeExpensiveCalculation = function(){
return $http.post().then(function(response){
if (isNewCalculationChained) {return timeExpensiveCalculation();}
else {return response.data;}
})
}
Мысли:
При использовании $http
я могу получить доступ к объекту конфигурации в ответе, чтобы использовать некоторые временные метки или другие идентификаторы для ручного упорядочения входящих ответов. Однако я надеялся, что смогу просто сказать angular как-то отменить устаревшее обещание и, таким образом, не запускать функцию .then(), когда она будет разрешена.
Это не работает без ручной реализации для $q
-промисов вместо $http
.
Может быть, стоит просто сразу отказаться от обещания? Но в обоих случаях это может занять вечность, пока, наконец, обещание не будет разрешено до того, как будет сгенерирован следующий запрос (что тем временем приводит к пустому представлению).
Есть ли какая-то угловая API-функция, которую мне не хватает, или существуют надежные шаблоны проектирования или «трюки» с цепочкой обещаний или $q.all для обработки нескольких обещаний, которые возвращают «одинаковые» данные?