等待第二个承诺

时间:2018-05-26 10:53:10

标签: javascript

现在我正在学习承诺,并希望从网络服务器获取一个令牌,它也使用了一个承诺。我之前没有承诺就试过了,但它也没有用。

这是第一块。

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

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

提前致谢。

2 个答案:

答案 0 :(得分:1)

你正在使用一个对象来解决你的第一个承诺,因此该对象是分辨率值(承诺不会神奇地依赖于作为该对象上属性值的承诺)。

当你有承诺或承诺合作时,没有理由使用Parse.Promise.when(promises).then(function(result) { response.success(result); ,只是链接它们;在这种情况下,通过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(/*...*/); 构造函数。

答案 1 :(得分:0)

你没有归还你的承诺:

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

然后我认为你需要像Promise一样处理它,有点像:

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