2016-10-25 3 views
1

У меня есть функция, которая делает некоторые серверные вызовы:

function doCalls(options) { 
    var deferred = $q.defer; 
    myService.doCallOne(options).then(function(response){ 
     myService.doCallTwo().then(function() { 
      deferred.resolve(); 
     }); 
    }); 
    return deferred.promise; 
} 

у меня есть множество различных вариантов, и я хочу, чтобы создать массив обещаний перейти к $q.all, поэтому я делаю это:

var promiseArray = []; 
_.each(optionArray, function(options) { 
    promiseArray.push(doCalls(options)); 
}); 

Тогда я стараюсь ждать их, чтобы решить:

$q.all(promiseArray).then(function() { 
    doNextPart(); 
}); 

Проблема, doNextPart() кажется, вызывался перед любым моих обещаний. Я делаю что-то явно не так?

+1

'$ q.defer' должен быть' $ q.defer() ' –

ответ

3

Вы забыли позвонить$q.defer, чтобы он фактически не создавал отложенную. Ваши вызовы функций doCalls возвращены undefined, ваши звонки deferred.resolve() вызывают исключения (которые были проглочены обещаниями) и $q.all немедленно выполняются с массивом undefined s.

Вы можете изменить свой код

var deferred = $q.defer(); 
//      ^^ 

, но на самом деле вы должны избегать deferred antipattern! Просто используйте

function doCalls(options) { 
    return myService.doCallOne(options).then(function(response){ 
     return myService.doCallTwo(); 
    }).then(function(secondResponse) { 
     return undefined; // you might want to omit this 
    }); 
} 
+0

D'о. Ага. Так оно и было. Теперь, когда она работает, я вырву этот антипаттерн! – opticon

+0

Не уверен, что это место для последующего наблюдения, но как я могу обрабатывать возможные ошибки сервера в вызовах? То есть. Как отклонить обещание с использованием этого предпочтительного шаблона? – opticon

+0

Вы можете «бросать» внутри 'then' обратные вызовы (исключение будет поймано и обещание будет отклонено с ним), или вы можете« вернуть »отклоненное обещание от обратного вызова' then' ('$ q.reject (new Error (...)) '). – Bergi

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