Итак, у меня есть эта проблема. Я довольно новичок в угловой, и мне сказали изменить директиву, которая управляет формами, чтобы кнопка отправки была отключена, а затем снова активирована, когда вся работа будет выполнена.AngularJS - «Цепочные обещания» с другими функциями между
Поскольку вызываемые функции обычно имеют асинхронные вызовы, просто добавление кода последовательно не работает.
var ngSubmit = function() {
vm.disabled = true;
$scope.ngSubmitFunction();
vm.disabled = false;
}
Кнопка активирована перед вызовами асинхронного вызова в режиме ngSubmitFunction().
Так я думал, что это обещание будет исправить, что и сделал что-то вроде:
var promise = function() {
return $q(function (resolve) {$scope.ngSubmitFunction()});
}
var ngSubmit = function() {
vm.disabled = true;
promise().then(function() {
vm.disabled = false;
});
}
Это не выдает какую-то ошибку, но никогда не позволяет кнопку еще раз (.then никогда не называется).
Пробовал другой вид обещания декларации, все с тем же результатом, за исключением этого один:
$scope.submitPromise = function() {
return $q.when($scope.ngSubmitFunction());
}
Это называет .then функции, но опять же, не ждать, пока какой-либо функции ребенка асинхронного закончить , «. then» вызывается мгновенно, как последовательная версия.
Имейте в виду, что я не знаю, что находится под ngSubmitFunction(). Он используется десятками разработчиков и может содержать от 0 до нескольких асинхронных вызовов. Но типичный сценарий что-то вроде:
ngSubmitFunction() вызывает Func()
- FUNC() решает кастрированный баран позвонить создать() или обновление()
- - обновление () вызывает elementFactory.update(), который является асинхронным вызовом
- - - elementFactory.update(). then (function()) вызывается по завершении.
- - - - В ЭТОМ пункте я должен снова включить кнопку.
Как я могу это достичь? есть ли способ связать обещания с функциями обезвреживания между ними? или другой способ сделать код только выполняться, когда все остальное сделано? Я думал о создании события в DataFactory, когда асинхронный вызов завершен, но если функция update() вызывала более одного асинхронного вызова, это не сработало.
Прежде всего, что возвращает ngSubmitFunction? ... Если его функция асинхронна и не возвращает обещание или, альтернативно, использует обратный шаблон (вы предоставляете функцию обратного вызова в качестве ввода) ... Затем ваш в значительной степени из удачи. --- Твоя ошибка сделать в ngSubmit, добавить возврат перед вашим обещанием(), затем ... – Jens
Ваш комментарий заставило меня задуматься. Все дочерние функции никогда не возвращались в нее, добавив, что возвращение заставило все работать, потому что в конце концов они всегда обещают. Проблема заключается в том, что он заставляет изменять каждый контроллер проекта треков 3.5M и доверять разработчикам всегда будет иметь оператор возврата для каждой создаваемой им функции ... не случайность. Есть ли другой способ «обнаружить» обещания, которые вызывается под «капюшоном» ngSubmitFunction(), с наблюдателями или чем-то еще? – p4x
Короткий ответ: Нет, нет, и я бы, конечно, рекомендовал применять это поведение для функций, которые работают с обещаниями вниз по стеке вызовов. Это просто хорошая практика и здравый смысл ИМО. (Очевидно, что есть угловые случаи, но давайте оставим их). Даже если бы все обещания имели одну и ту же структуру, и вы взломали что-то, что могло бы рассказать вам о действующих в настоящее время обещаниях, было бы невозможно узнать, чего ждать, вы можете сказать, что дождались всего этого, но тогда вам гарантировано увидеть бесконечные замки здесь и там и т. д. – Jens