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 .