pulkitsinghal
pulkitsinghal

Reputation: 4084

How to stop a promise chain when using $state.go() in angular?

I have a chain of promises that are responsible for initializing my controller. In this chain if a certain condition isn't met, it would be best to send the user to another state via $state.go() and stop the rest of the promise chain from running. How can this be accomplished?

loadData1() .then(function(){ return loadData2(); }) .then(function(){ if (...) { $state.go(...); // how should the existing promise chain be killed off or stopped? } else { return loadData3(); } }) .then(function(){ return loadData4(); }) .then(function(){ console.log('controller initialized successfully'); }, function(error){ console.log('failed to initialize controller'); });

Upvotes: 0

Views: 516

Answers (1)

ovrkenthousand
ovrkenthousand

Reputation: 478

Instead of immediately calling $state.go, throw an error and check for it in the error handler at the end.

loadData1()
.then(function () {
  return loadData2();
})
.then(function () {
  if (exceptionalCondition) {
    throw new Error('[MyCtrl:loadData2] Data failed to load!');
  }
  return loadData3();
})
...
.then(function () {
  console.log('controller initialized successfully');
},
function (error) {
  if (/^\[MyCtrl:loadData2\]/.test(error.message)) {
    $state.go(redirect);
  } else {
    console.log('failed to initialize controller');
  }
});

The nice thing about using promises is that they will handle errors and immediately terminate the chain if one occurs.

Upvotes: 1

Related Questions