【问题标题】:async / await resolves without promise finishingasync / await 在没有承诺完成的情况下解决
【发布时间】:2017-03-28 04:44:07
【问题描述】:
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() 仍然返回,我不知道为什么。

【问题讨论】:

    标签: javascript asynchronous promise async-await


    【解决方案1】:

    您似乎想要构造一个在某个事件上被解决或拒绝的 Promise。这不是您的代码所做的远程操作。

    handleStatus 实际上并没有返回任何内容,因为其中没有 return 语句。唯一的 return 语句在事件处理程序中,它们被丢弃。另外,你对Promise.resolvePromise.reject有误解:它们是用来在调用时创建新的Promise实例的;再说一次,这不是你想要的。

    您实际上想要创建一个 new Promise 并返回它:

    const handleStatus = (ref, error = "Unknown error") => {
      return new Promise((resolve, reject) => {
        ref.child("status").on("value", snapshot => {
          const status = snapshot.val();
          if (status === SUCCESS) {
            ref.child("status").off();
            resolve(error); // is this really what you mean?
          } else if (status !== PENDING) {
            reject(error);
          }
        });
      });
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      • 2022-11-15
      • 1970-01-01
      相关资源
      最近更新 更多