Joe
Joe

Reputation: 675

How to chain in series promises

I would like to chain in series promises so that that in order the 3 promises execute. I don't want to nest the functions. I tried adding a resolve into it, but it seems like it resolves before everything inside of the function is done.

function first(){
  var promise = new Promise(function(resolve, reject){
            console.log('fetchToken 1');
  });
  return promise;
}

function second(item){
  var promise = new Promise(function(resolve, reject){
            console.log('fetchToken 2');
  });
  return promise;
}

function third(item){
  var promise = new Promise(function(resolve, reject){
            console.log('fetchToken 3');
  });
  return promise;
}

  function getTokenGroup() {
    function logTaskError(e) {
        console.error(e);
        throw e;  // reject the Promise returned by then
    }
    var task1 = first();
    var task2 = task1.then(second);
    var task3 = task2.then(third);
    var alltasks = task3.then(null, logTaskError);

    return alltasks;
  }

  getTokenGroup();

Upvotes: 0

Views: 70

Answers (3)

bugwheels94
bugwheels94

Reputation: 31940

Call resolve inside functions so the promises get resolved

function first() {
  var promise = new Promise(function(resolve, reject) {
    console.log('fetchToken 1');
    resolve();
  });
  return promise;
}

function second(item) {
  var promise = new Promise(function(resolve, reject) {
    console.log('fetchToken 2');
    resolve();
  });
  return promise;
}

function third(item) {
  var promise = new Promise(function(resolve, reject) {
    console.log('fetchToken 3');
    resolve();
  });
  return promise;
}

function getTokenGroup() {
  function logTaskError(e) {
    console.error(e);
    throw e; // reject the Promise returned by then
  }
  var task1 = first();
  var task2 = task1.then(second); // why return new promise
  var task3 = task2.then(third);
  var alltasks = task3.then(null, logTaskError);

  return alltasks;
}

getTokenGroup();

Or better as can continue the first promise using then

function first() {
  console.log('fetchToken 1');
}

function second(item) {
  console.log('fetchToken 2');
}

function third(item) {
  console.log('fetchToken 3');
}

function getTokenGroup() {
  function logTaskError(e) {
    console.error(e);
    throw e; // reject the Promise returned by then
  }
  var promise = Promise.resolve(0);  // create a resolved promise
  var task1 = promise.then(first);
  var task2 = task1.then(second);
  var task3 = task2.then(third);
  var alltasks = task3.then(null, logTaskError);

  return alltasks;
}

getTokenGroup();

Upvotes: 1

zoly01
zoly01

Reputation: 127

you need call "resolve":

 function first(){
    var promise = new Promise(function(resolve, reject){
      console.log('fetchToken 1');
      resolve(1); //==> call this one, parameter in here is just a sample
    });
    return promise;
  }

  function second(item){
    var promise = new Promise(function(resolve, reject){
      console.log('fetchToken 2');
    });
    return promise;
  }

  function third(item){
    var promise = new Promise(function(resolve, reject){
      console.log('fetchToken 3');
    });
    return promise;
  }

  function getTokenGroup() {
    function logTaskError(e) {
      console.error(e);
      throw e;  // reject the Promise returned by then
    }
    var task1 = first();
    var task2 = task1.then(second);
    var task3 = task2.then(third);
    var alltasks = task3.then(null, logTaskError);

    return alltasks;
  }

  getTokenGroup();

Upvotes: 0

Zohaib Ijaz
Zohaib Ijaz

Reputation: 22885

You need to resolve a promise otherwise it will not propagate further.

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise

function first(){
   return new Promise(function(resolve, reject){
        console.log('fetchToken 1');
        resolve('your data');
   })
}

Upvotes: 0

Related Questions