2016-06-03 2 views
3

Что такое правильный способ использования $q.all в цепочке обещаний then статья?

Вот какой-то псевдо-код, иллюстрирующий то, что я пытаюсь сделать.

function nestedPromise(val) 
{ 
    return aPromiseReturningFunction(val) 
     .then($q.all(val.arrayProperty.map(function(anotherVal) 
     { 
      return anotherPromiseReturningFunction({ 
       prop1: anotherVal.prop 
      }); 
     }))); 
} 

Expectation: если какой-либо из обещаний вернулся в вызове $q.all отклонить, обещание, возвращаемый nestedPromise отвергнут.

Актуально: обещание, возвращенное nestedPromise, разрешено, хотя одно из обещаний, возвращенных при вызове $q.all, отклонено.

Я не могу опубликовать все, что я пытался заставить это работать, потому что я чувствую, что я буквально все пробовал ... catch es по всему месту, используя deferred и т. Д. Я думаю, что в какой-то момент я получил вещи «работая», используя тонну отсрочек и catch, но это было действительно уродливо, и это определенно не сработало, потому что я знал, что делаю.

Ожидается, что поведение всех вызовов функций в моем $q.all вызове для запуска параллельно? Кажется, это то, что в настоящее время происходит, потому что даже после того, как одно обещание отвергает, остальные продолжают работать. На данный момент я могу справиться с этим поведением, хотя это не кажется совершенно правильным, и я хотел бы знать, как остановить выполнение после первого отказа.

+0

'затем' принимает функцию, я не знаю,' $ q' но похоже, что вы могли бы просто сделать: 'val => $ q.all (..)'. Я не могу сказать, ожидаете ли вы, что 'val' внутри' q.all' будет таким же, как параметр 'nestedPromise' или разрешенное значение обещания. – MinusFour

+2

К функции 'then', передайте функцию, которая возвращает' $ q.all (/ * ... * /) ', то есть обещание. – LoremIpsum

+0

Спасибо за ваш ответ @LoremIpsum! Итак, вы говорите, что сломаете '$ q.all' часть в отдельную функцию и назовите это в моем' then'? Что относительно этого функционально отличается от того, что я делаю? –

ответ

4

then() ожидает, что функция будет передана ему. Вы в настоящее время проходит еще один объект Promise здесь

then($q.all(val.arrayProperty.map(function(anotherVal)

Вы должны вместо этого делать этот

function nestedPromise(val) { 
    return aPromiseReturningFunction(val) 
     .then(function() { 
     return $q.all(val.arrayProperty.map(function(anotherVal) { 
      return anotherPromiseReturningFunction({ 
      prop1: anotherVal.prop 
      }); 
     }) 
     }); 
} 
+1

Выглядит, обещает! Я не могу проверить это сейчас. Отправляется как можно скорее. Большое спасибо за ответ! –

+0

Это определенно работает. Однако, если я нарушаю анонимную функцию внутри 'then' в отдельную функцию, она перестает работать. Почему это так? Кроме того, имеете ли вы какое-либо представление о обещаниях в '$ q.all', не прекращаете работать, когда встречается первое отклонение? –

+0

Вы можете разбить анонимную функцию на отдельную функцию, если она возвращает 'Promise'. Поскольку '$ q.all()' останавливается при первом отказе, это по дизайну, либо ожидает всех обещаний для разрешения, либо отклоняет, если во время выполнения происходит ЛЮБОЕ отклонение. – peteb