2015-02-10 2 views
1

Это не большая проблема, однако, я считаю, это иногда очень «некрасиво», чтобы написать код, например:Как избежать вложенных асинхронных блоков в Угловом

angular.module('xxx', []).controller('xxxCtrl', function() { 
    someAsyncCall(params, function callback(result) { 
    //millions of lines here dependent on "result". 
    } 
}) 

Я не использую маршрутизацию здесь, так что я не могу используйте «разрешение».

Есть ли другие способы избежать этого?

+0

Можно ли переместить некоторые или все из кода вызова, связанные с асинхронным в сервис? –

+0

Вы, вероятно, захотите использовать '$ q' https://docs.angularjs.org/api/ng/service/$q –

+0

@NateBarbettini Это фактически все $ scope, связанные с одним из моих недавних случаев, поэтому я не думайте, что это выгодно переместить их в службу. –

ответ

2

Расширение комментария Патрика, используя $ д вы могли бы сделать что-то вроде следующей схемы:

/* handlers, parsers, ... */ 
function parseSomeAsyncResult() { ... } 
... 
function displaySomeAsyncResult() { ... } 
function errorHandler() { ... } 

/* now we can chain together as many handlers as needed to process our results */ 
someAsyncCall(params) 
    .then(parseSomeAsyncResult) 
    .then(displaySomeAsyncResult) 
    .catch(errorHandler); 
+0

Если мне нужно сначала получить 4 значения асинхронно, это будет по-прежнему немного неприятным без помощи асинхронных библиотек, таких как async. Очевидно, что я бы не хотел включать такие библиотеки на мою страницу, чтобы добиться этого. Есть ли другой совет? –

+1

Чтобы обработать список обещаний, вы можете использовать '$ q.all()', который также дает вам обещание https://docs.angularjs.org/api/ng/service/$q#all –

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