javascript - async/await 在没有 promise 完成的情况下解决

标签 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) (或 else 语句)时才能解析,这通常需要一些时间 .on("value")函数(如果您感兴趣,但与问题无关,则来自 firebase)。目前它立即解决,if 语句中没有任何内容被执行,并且 Database.create() 仍然返回,我不知道为什么。

最佳答案

您似乎想要构造一个在事件上解决或拒绝的 Promise。这根本不是您的代码所做的。

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

您实际上想要创建一个新的 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);
      }
    });
  });
};

关于javascript - async/await 在没有 promise 完成的情况下解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43054863/

相关文章:

javascript - Material 组件 : Keeping Menu "Open" when clicking inside

javascript - React Router v4.0 - 重定向到路由器范围之外的页面

javascript - 等待 requestAnimationFrame 完成(通过回调)

javascript - 使用 async/await 时调用堆栈的工作

javascript - 免费的 jQuery Grid,支持卡住列和动态数据

node.js redis同步解决方案

javascript - Node.js - 寻找异步功能

javascript - 在 JavaScript 中抽象掉异步/ promise ?

node.js - 无法解构属性错误 - googleapi

javascript - 窗口大小改变时如何防止div重叠?