Я читал около $q и promises в течение нескольких дней, и я, кажется, это понимаю... несколько. На практике я имею следующую ситуацию:
- Выполняется запрос $http и проверяется, может ли быть выполнен следующий вызов.
-
Если первый вызов завершился неудачно, верните "нет данных" , если он преуспеет и говорит, что вызов может быть выполнен, второй вызов выполняется, если нет - "нет данных" снова. Если второй вызов завершается успешно, он возвращает данные, если нет - "нет данных" . Похоже на это (примерно, я упрощен для общей идеи, поэтому не беспокойтесь о незначительных ошибках здесь):
return $http.get (something) .then(function(allowedAccess){ if(allowedAccess){ return $http.get (somethingElse) .then( function(result){return {data:result} }, function(error){return {data:"n0pe"} } ) } else { return {data:"n0pe"} } }, function(){ return {data:"n0pe"} });
Мне сказали использовать здесь $q. Я действительно не понимаю, как и почему. $Http-вызовы уже promises.
Если есть способ сделать это чище, я его не вижу. Просто перечитал этот пост по теме. По сути, я что-то упустил/есть лучший способ сделать это?
Изменить: также просто перечитать учебник по цепочке promises - он вообще не обрабатывает сбои вызовов. В основном публиковать это как должную осмотрительность.
Изменить 2: Это более подробно из теории, о которой я спрашиваю, выдержки из первой статьи:
Это простой пример. Это становится действительно мощным, если ваш обратный вызов then() возвращает другое обещание. В этом случае следующий then() будет выполняться только после того, как обещает решение. Этот шаблон может использоваться для последовательных HTTP-запросов, например (где запрос зависит от результата предыдущего):
Это, похоже, говорит о таких цепочках:
asyncFn1(1)
.then(function(data){return asyncFn2(data)})
.then(function(data){return asyncFn3(data)})
Итак, если я правильно понимаю это а). Не относится ко мне, потому что у меня нет третьей функции. б). Будет применяться ко мне, если бы у меня было три функции, потому что, когда я запускаю оператор if в первом запросе $http, и только внутри оператора if я возвращаю другое обещание. Итак, теоретически, если бы у меня было три функции асинхронного программирования, мне нужно было бы включить выражение if if в обещание?