首页 > 解决方案 > 等待第二个承诺

问题描述

现在我正在学习 Promise 并想从一个也使用 Promise 的网络服务器获取一个令牌。我之前尝试过没有承诺,但它也不起作用。

这是第一块。

  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");
    });

只有访问令牌不起作用,这是在我的助手类中,它看起来像这样。

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;
  });
}

我得到了访问令牌,但通常是在第一个承诺之后。

提前致谢。

标签: javascript

解决方案


您正在用一个对象履行您的第一个承诺,因此该对象是履行价值(承诺不会神奇地解析为作为该对象属性值的承诺)。

new Promise当您有一个或多个承诺可以使用时,没有理由使用,只需将它们链接起来;在这种情况下,通过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(/*...*/);

注意我更正了“exercise”的拼写,这可能需要更改您的botCommands构造函数。


推荐阅读