angularjs - Angular promises: trigger catch(...) from within a then(...) statement? -
is possible trigger catch(...)
portion of promise chain within then(...)
portion?
for example, make $http request , chain behavior. $http resolves successfully, upon processing of data, clear data more suited error case, want activate error handler instead.
the issue -- i've got promise chain being used within 2 locations; 1 within service itself, , other in controller activated service. controller 1 handles catch(...)
portion of promise chain, opens modal displays error message.
so far, i've been able chain promise such that, whenever then(...)
or catch(...)
triggered within service, can return result, , triggered within controller -- expected.
but how have then(...)
trigger within service, return result such catch(...)
triggered instead within controller?
i tried using $q.reject(...)
create , return new promise, return value within then(...)
function, didn't seem work.
example:
var url = 'http://google.com'; $http.get(url).then(handlefirst).then(handlesecond).catch(error); function handlefirst (response) { console.log("handlefirstcalled", response); return response; } function handlesecond (response) { console.log("handlesecondcalled", response); return response; } function error (response) { console.log("errorcalled", response); }
how handlefirst(...)
, skip executing handlesecond(...)
, , execute error(...)
instead? note: can't call error(response)
because there's no access outside promise chain.
[edit:] found solution, return $q.reject(response);
work. however, service catch(...)
function has return $q.reject(response)
. previously, had return response;
, continued controller promise chain. controller activate then(...)
within chain.
so return response;
went:
service -> $http -> then(...) -> catch(...) -> controller -> (...)
by changing return $q.reject(response);
goes:
service -> $http -> then(...) -> catch(...) -> controller -> catch (...)
you have 2 options in angular reject returned promise within then.
throw new error(...); // reject promise , trigger $exceptionhandler
or:
return $q.reject(new error(...)); // reject promise
use first 1 signal error can't recover , latter errors can recover from.
note in standard (es6 promises) , other compliant promises (like bluebird) distinction between throwing , rejecting isn't made.
Comments
Post a Comment