簡體   English   中英

異步/等待解決,但沒有完成承諾

[英]async / await resolves without promise finishing

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

我遇到上述代碼的問題,尤其是在Database.create()函數中立即解決的handleStatus 我希望它僅在if (status === SUCCESS) (或else語句)的if (status === SUCCESS)才能解決,這通常會花費該.on("value")函數的時間(如果您有興趣,則來自.on("value") ,但與問題)。 目前,它立即解決,如果if語句被執行並且Database.create()仍然返回,則什么也沒有,我不確定為什么。

您似乎想要構造一個在事件上解決或拒絕的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);
      }
    });
  });
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM