Kira
Kira

Reputation: 147

Wait for second promise

Right now I'm learning promises and want to get a token from a webserver, which also uses a promise. I tried it before without a promise but it's also not working.

This is the first block.

  promise = new Promise(resolve => {
    let accessToken = helper.getAccessToken(baseUrl);
    let userCollection = helper.createCollection("user", db);
    let excersizeCollection = helper.createCollection("excercise", db);
    resolve({
      accessToken: accessToken,
      database: {
        userCollection: userCollection,
        excersizeCollection: excersizeCollection
      }
    });
  });
  promise
    .then(promises => {
      console.log("my token" + promises.accessToken);
      new nceDefaultbotCommands(bot, promises.accessToken, baseUrl);
      new botComamnds(bot, promises.database);
      let userController = new reqUserController(
        baseUrl,
        0,
        promises.accessToken
      );

      bot.start();
    })
    .catch(() => {
      console.log("error");
    });

Only the access token is not working, this is in my helper class and it looks like this.

static getAccessToken(baseUrl) {
  let promise = new Promise(resolve => {
    request.post(
      {
        url: baseUrl + "/token",
        body: {
          credentials: {
            user: "USER",
            password: "PW"
          }
        },
        json: true //// Automatically parses the JSON string in the response
      },
      (error, response, body) => {
        if (error) console.log("error");
        if (!error && response.statusCode === 200) {
          resolve({ token: body.token });
        }
      }
    );
  });
  promise.then(resolve => {
    console.log(resolve.token);
    return resolve.token;
  });
}

I get the access token but normally after the then of the first promise.

Thanks in advance.

Upvotes: 0

Views: 70

Answers (2)

T.J. Crowder
T.J. Crowder

Reputation: 1075785

You're fulfilling your first promise with an object, so that object is the fulfillment value (the promise isn't magically resolved to the promises that are values of properties on that object).

There's no reason to use new Promise when you have a promise or promises to work with, just chain off them; in this case, via Promise.all:

Promise.all([
    helper.getAccessToken(baseUrl),
    helper.createCollection("user", db),
    helper.createCollection("excercise", db)
])
.then(([accessToken, userCollection, exersizeCollection]) => { // Note the destructuring
    console.log("my token" + accessToken);
    new nceDefaultbotCommands(bot, accessToken, baseUrl);
    new botComamnds(bot, {userCollection, exersizeCollection});
    let userController = new reqUserController(baseUrl, 0, accessToken);

    bot.start();
})
.catch(/*...*/);

Note I corrected the spelling of "exercise," which may require changes to your botCommands constructor.

Upvotes: 1

Tomasz Mularczyk
Tomasz Mularczyk

Reputation: 36219

You do not return your Promise:

static getAccessToken(baseUrl) {
  let promise = new Promise(resolve => {
    ...
  });
  return promise.then(resolve => {
    console.log(resolve.token);
    return resolve.token;
  });
}

Then I think you need to handle it like Promise, somewhat like:

promise = new Promise(resolve => {
    let accessToken = helper.getAccessToken(baseUrl).then(token => {
      let userCollection = helper.createCollection("user", db);
      let excersizeCollection = helper.createCollection("excercise", db);
      resolve({
        accessToken: accessToken,
        database: {
          userCollection: userCollection,
          excersizeCollection: excersizeCollection
        }
      });
    });  
  });

Upvotes: 0

Related Questions