javascript - 处理异步函数

标签 javascript reactjs

我有以下功能:

export function readUserData(userName, password) {
  firebase.database().ref("users/" + userName).once("value").then(function (snap) {
    //console.log(snap.val().salt);
    var verification = passwordVerify(password, snap.val().salt);
    //console.log(verification);
    //console.log(snap.val().password);
    console.log(snap.val());
    return snap.exists() && snap.val().password === verification 
      ? userAuth.located = snap.val()
      : userAuth.located = false;
  });
  return userAuth.located;
}

我被告知 firebase.database().ref 是一个异步函数,它似乎是这样的,因为它在写入 console.log(snap.val()) 之前在 readUserData 的最后一行返回 userAuth. located ;
如何确保 firebase.database().ref... 在返回最终结果之前执行?我不确定如何在这段代码中实现等待/ promise ,因为整体功能不是异步的。

最佳答案

你应该返回 promise ,例如:

export function readUserData(userName, password) {
    return firebase.database().ref("users/" + userName)
      .once("value")
      .then(function (snap) {
        var verification = passwordVerify(password, snap.val().salt);
        return snap.exists() && snap.val().password === verification 
          ? snap.val()
          : false;
    });
}

然后,无论哪个代码调用此方法,也应该异步等待:

var userAuthLocated = await readUserData(userName, password);

或者,有 promise :

readUserData(userName, password)
  .then(userAuthLocated => {
    // use userAuthLocated here
  });

关于javascript - 处理异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59256864/

相关文章:

javascript - React 将 props 传递给 onChange

Asp.Net Core React+Redux 教程或者什么是 React、React+Redux 和 ReactJs.net?

reactjs - 如何在使用 create-react-app 创建的 React 应用程序的生产版本中删除 console.log?

javascript - 在 Gatsby/@ReachRouter 中处理预取的动态客户端路由

javascript - 带有圆 Angular 的html5 Canvas 三 Angular 形

javascript - 根据另一个下拉菜单的选择更改第二个下拉菜单的值

javascript - 流行的 Big Buck Bunny mp4 视频上的 "Cannot play media. No decoders for requested formats"

javascript - TypeError : this. props.onSelectChange 不是函数

javascript - 设置子节点的属性

javascript - 自动滚动不会滚动到元素,损坏的 JS