async / await解析而没有承诺完成

时间:2017-03-27 19:28:15

标签: javascript asynchronous promise async-await

const handleStatus = (ref, error = "Unknown error") => {
  ref.child("status").on("value", snapshot => {
    const status = snapshot.val();
    if (status === SUCCESS) {
      ref.child("status").off();
      return Promise.resolve(error);
    } else if (status !== PENDING) {
      return Promise.reject(error);
    }
  });
};

export default class Database {
  /**
   * @desc create character
   * @type {Promise}
   */
  static create = async (uid = "", username = "", gender = "", race = "") => {
    try {
      const ref = database.ref(`/void/create/${uid}`);
      await ref.set({ username, gender, race, status: PENDING });
      await handleStatus(ref, "Unable to create character, please try again latter");
    } catch (e) {
      return Promise.reject("Username already taken");
    }
  };
}

我遇到上述代码的问题,特别是handleStatusDatabase.create()函数中立即解析。我希望它只能在if (status === SUCCESS)满足(或者语句)时才解决,这通常需要一些时间来自.on("value")函数(如果你感兴趣,来自firebase,但与问题无关)。在它立即解决的那一刻,if语句中没有任何内容被执行且Database.create()仍然返回,我不知道为什么。

1 个答案:

答案 0 :(得分:3)

您似乎想要构建一个在事件中被解决或拒绝的Promise。这不是你的代码所做的远程。

kernel.request实际上没有返回任何内容,因为其中没有handleStatus语句。唯一的return语句位于事件处理程序中,它们将被丢弃。此外,您误解了returnPromise.resolve:它们用于在调用时创建新的Promise实例;再一次,这不是你想要的。

您实际上想要创建一个Promise.reject并返回:

new Promise