2016-09-15 4 views
1

Итак, у меня есть эта проблема. Я довольно новичок в угловой, и мне сказали изменить директиву, которая управляет формами, чтобы кнопка отправки была отключена, а затем снова активирована, когда вся работа будет выполнена.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() вызывала более одного асинхронного вызова, это не сработало.

+0

Прежде всего, что возвращает ngSubmitFunction? ... Если его функция асинхронна и не возвращает обещание или, альтернативно, использует обратный шаблон (вы предоставляете функцию обратного вызова в качестве ввода) ... Затем ваш в значительной степени из удачи. --- Твоя ошибка сделать в ngSubmit, добавить возврат перед вашим обещанием(), затем ... – Jens

+0

Ваш комментарий заставило меня задуматься. Все дочерние функции никогда не возвращались в нее, добавив, что возвращение заставило все работать, потому что в конце концов они всегда обещают. Проблема заключается в том, что он заставляет изменять каждый контроллер проекта треков 3.5M и доверять разработчикам всегда будет иметь оператор возврата для каждой создаваемой им функции ... не случайность. Есть ли другой способ «обнаружить» обещания, которые вызывается под «капюшоном» ngSubmitFunction(), с наблюдателями или чем-то еще? – p4x

+0

Короткий ответ: Нет, нет, и я бы, конечно, рекомендовал применять это поведение для функций, которые работают с обещаниями вниз по стеке вызовов. Это просто хорошая практика и здравый смысл ИМО. (Очевидно, что есть угловые случаи, но давайте оставим их). Даже если бы все обещания имели одну и ту же структуру, и вы взломали что-то, что могло бы рассказать вам о действующих в настоящее время обещаниях, было бы невозможно узнать, чего ждать, вы можете сказать, что дождались всего этого, но тогда вам гарантировано увидеть бесконечные замки здесь и там и т. д. – Jens

ответ

0

Если вы используете обещания, ваши функции асинхронных должны возвращать обещания, если они делают это должно работать так:

var ngSubmit = function() { 
    vm.disabled = true; 
    $scope.ngSubmitFunction().then(() => { 
     vm.disabled = false; 
    }); 
} 
0

Я не знаю, что под ngSubmitFunction()

Тогда вам не повезло, обещания вам не помогут. Обещания или $q.when не могут волшебным образом проверить вызов и посмотреть, какие асинхронные вещи он начал или даже дождался, - ngSubmitFunction() должно вернуть обещание для своих асинхронных результатов.

Вам необходимо сделать каждые функции в вашей кодовой базе, которая (возможно) делает что-то асинхронное, что должно быть долгожданным. Нет никакого способа обойти это.

0

Ну, на случай, если кто-то задается вопросом, мы не нашли решения для этого (вероятно, нет). Таким образом, мы перейдем к добавлению возвратов ко всей цепочке функций, чтобы удостовериться, что ngSubmitFunction получает обещание, и поэтому может дождаться его завершения до вызова «.then». Мало того, что это работает для тех случаев, когда есть только одно обещание, но это также хорошая практика программирования.

Случаи с более чем одним обещанием ограничены, поэтому мы будем рассматривать их отдельно на самом контроллере.

Спасибо всем за ваши комментарии.

Смежные вопросы