Ordem de execução angular com `$ q` – Promessas de Encadeamento

Seguindo os trabalhos da Abordagem:

$q.when() .then(checkCookieToken) // check if cookie already exists eg in cookie .then(setHeader) // set Header with REST-Token eg from cookie .then(checkTokenOnline) // if not OK logout .then(getMenu) // if previous OK get navigation menu .then(getDataResource) // set ngResource .then(getData); // and query it 

4 perguntas:

1) Se, por exemplo, checkTokenOnline não estiver OK, eu não quero executar as funções de descanso, como posso sair (sair, quebrar, o que, ..) neste momento?

2) Como posso definir alguns deles paralelos e alguns deles em série?

3) Como posso transferir dados entre eles?

4) Como posso fazer a seguinte function depender do seu resultado anterior?

Você está perguntando como encadear funções em promises.

3) Como posso transferir dados entre eles?

4) Como posso fazer a seguinte function depender do seu resultado anterior?

Retornar dados (ou uma promise) para a próxima function na cadeia :

 var p2 = p1.then ( function (data) { var nextData = someFn(data); return nextData; }); var p3 = p2.then ( function (nextData) { var nextData2 = someOtherFn(nextData); return nextData2; }); //return for further chaining return p3; 

1) Se, por exemplo, checkTokenOnline não estiver OK, eu não quero executar as funções de descanso, como posso sair (sair, quebrar, o que, ..) neste momento?

Para rejeitar uma promise, faça com que sua function lance um erro. A cadeia ignorará todos os methods .then até você fornecer um manipulador de erros.

 var p2 = p1.then ( function checkTokenOnline (response) { if ( isBadFn(response) { throw error; } else { return nextData; } }) .then ( someFn ) .then ( someOtherFn ) .catch ( function (error) { // someFn and someOtherFn skipped //log error throw error; }); //return for further chaining return p2; 

2) Como posso definir alguns deles paralelos e alguns deles em série?

Para executar duas funções em paralelo, faça duas promises. Use $q.all para esperar que ambos sejam concluídos.

 var p1 = $q.when ( fn1() ); var p2 = $q.when ( fn2() ); var p3 = $q.all ( [p1, p2] ); var p4 = p3.then ( function (responseList) { var response1 = responseList[0]; var response2 = responseList[1]; return something; }). catch ( function (error) { //log error throw error; }); //return for further chaining return p4; 

Esteja ciente de que $q.all não é resiliente . Se alguma promise gerar um erro, o método .then será ignorado e somente o primeiro erro irá para o método .catch .

A regra geral para a functional programming é sempre retornar algo .


Links Úteis

  • AngularJS $ q Referência – Encadeamento promete
  • Você está perdendo o ponto de promises .
  • Esquadrão Ninja – Armadilhas, antipadrões e dicas sobre o AngularJS prometem
Intereting Posts