处理异步功能

时间:2019-12-09 21:24:31

标签: 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。 ;
我如何确保在返回最终结果之前执行firebase.database()。ref ...?我不确定如何在此代码中实现wait / promises,因为整体功能不是异步的。

2 个答案:

答案 0 :(得分:2)

您应该返回承诺,例如:

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

或者,带有承诺:

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

答案 1 :(得分:0)

要在@Seaphin上发表您的评论。下一行还需要一步

var userAuthLocated = await readUserData(userName, password);

正在发生的事情是您的应用在更新之前正在使用userAuthLocated。通过readUserData中的firebase调用确实会更新userAuthLocated,但是,您缺少async()函数。

使用await应该总是包装在async()函数调用中。它看起来应该与此类似

userAuth = async () => {
    var userAuthLocated = await readUserData(userName, password);
    //setstate or
    return userAuthLocated

基本上使用异步“块”,直到可以使用该值为止。直到异步功能解除阻止,等待该值的功能才会执行