在调用下一个函数之前,如何等待firebase.database()。ref('users /'+ userId).set()完成?

Sti*_*iño 0 javascript firebase firebase-realtime-database

我正在使用以下异步函数将数据写入Firebase实例:

function writeUserData(uid, fn, ln, userEmail) {
  firebase.database().ref('users/' + uid).set({
    firstName: fn,
    lastName: ln, 
    email: userEmail
  });
};
Run Code Online (Sandbox Code Playgroud)

一旦writeUserData完成,那么我想将用户重定向到另一个页面:

window.location.href = "./mypage.html";
Run Code Online (Sandbox Code Playgroud)

据我所知,这可以通过承诺来完成,但是我真的可以用一个很好的例子来解决这个问题。

小智 5

根据firebase的文档:https ://firebase.google.com/docs/database/web/read-and-write#receive_a_promise ,该set方法返回一个promise。在这种情况下,最简单的示例是:

function writeUserData(uid, fn, ln, userEmail) {
  firebase.database().ref('users/' + uid).set({
    firstName: fn,
    lastName: ln, 
    email: userEmail
  }).then(function onSuccess(res) {
    window.location.href = "./mypage.html";
  }).catch(function onError(err) {
    // do sth, e.g. console.error(err);
  });
};
Run Code Online (Sandbox Code Playgroud)

您的代码和我的示例之间的区别是我添加的部分:

.then(function onSuccess(res) {
  window.location.href = "./mypage.html";
}).catch(function onError(err) {
  // do sth
});
Run Code Online (Sandbox Code Playgroud)

简而言之,意思是“如果请求成功,则onSuccess执行onError

您可以在此处获取有关Promises如何工作的更多信息:Promise mdn docs


为了提高可读性,您可以这样编写:

function writeUserData(uid, fn, ln, userEmail) {
  firebase.database().ref('users/' + uid).set({
    firstName: fn,
    lastName: ln, 
    email: userEmail
  })
  .then(onSuccess)
  .catch(onError);
};

function onSuccess(res) {
  window.location.href = "./mypage.html";
}

function onError(err) {
  // do sth
}
Run Code Online (Sandbox Code Playgroud)