Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 异步/等待解析,无需承诺完成_Javascript_Asynchronous_Promise_Async Await - Fatal编程技术网

Javascript 异步/等待解析,无需承诺完成

Javascript 异步/等待解析,无需承诺完成,javascript,asynchronous,promise,async-await,Javascript,Asynchronous,Promise,Async Await,我遇到上述代码的问题,尤其是handleStatus在数据库中立即解析。create()函数。我希望它只有在满足(status==SUCCESS)时才能解决,这通常需要一些时间才能从.on(“value”)函数(如果您感兴趣,来自firebase,但与问题无关)。当它立即解析时,if语句中没有任何内容被执行,Database.create()仍然返回,我不知道为什么。您似乎想要构造一个承诺,该承诺在事件中被解析或拒绝。这不是你的代码所做的 handleStatus实际上不返回任何内容,因为其中没

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

您似乎想要构造一个承诺,该承诺在事件中被解析或拒绝。这不是你的代码所做的

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

实际上,您希望创建一个
新承诺
,并返回:

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

你似乎想要构建一个承诺,而这个承诺在一个事件中被解决或拒绝。这不是你的代码所做的

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

实际上,您希望创建一个
新承诺
,并返回:

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