2

我想在我的網頁上創建一個「創建用戶」功能。在創建用戶時,它同時存儲用戶寫入的數據,例如名稱等。在完成此操作後,用戶應該只爲用戶提供一個頁面,問題出在我的代碼之前,用戶的數據(名稱等) )被存儲,用戶正在被呈現新的頁面。我怎樣才能防止這種情況發生?創建用戶,保存數據,然後改變頁面

我創建用戶功能:

firebase.auth().createUserWithEmailAndPassword(email, pass).then(function() { 
 
    // User is created 
 
    const imageUrl = "images/genericProfilePicture.png"; 
 
    const admin = false; 
 
    const currentTime = timeStamp(); 
 

 
    var user = firebase.auth().currentUser; 
 
    const userId = user.uid; 
 

 

 
    firebase.database().ref('users/' + userId).set({ 
 
    name: name, 
 
    email: email, 
 
    address: address, 
 
    zip: zip, 
 
    city: city, 
 
    department: department, 
 
    membership: membership, 
 
    admin: admin, 
 
    added: currentTime, 
 
    profile_picture : imageUrl 
 
    }); 
 

 
    window.open('frontpage.php', '_top'); 
 

 

 
}).catch(function(error) { 
 
    // Error has happened 
 
    var errorCode = error.code; 
 
    var errorMessage = error.message; 
 

 
    alert(errorMessage); 
 
});

嘗試這種代碼沒有任何的運氣,沒有存儲數據,並沒有新的頁面顯示:

firebase.database().ref('users/' + userId).set({ 
 
\t \t \t \t \t \t \t \t name: name, 
 
\t \t \t \t \t \t \t \t email: email, 
 
\t \t \t \t \t \t \t \t address: address, 
 
\t \t \t \t \t \t \t \t zip: zip, 
 
\t \t \t \t \t \t \t \t city: city, 
 
\t \t \t \t \t \t \t \t department: department, 
 
\t \t \t \t \t \t \t \t membership: membership, 
 
\t \t \t \t \t \t \t \t admin: admin, 
 
\t \t \t \t \t \t \t \t added: currentTime, 
 
\t \t \t \t \t \t \t \t profile_picture : imageUrl 
 
\t \t \t \t \t \t \t }).then(() => { 
 
    \t \t \t \t \t \t window.open('frontpage.php', '_top'); 
 
    \t \t \t \t \t \t });

回答

1

選項1後需要.then

剛剛鏈set()then()塊:

firebase.database().ref('users/' + userId).set({ 
    name: name, 
    email: email, 
    address: address, 
    zip: zip, 
    city: city, 
    department: department, 
    membership: membership, 
    admin: admin, 
    added: currentTime, 
    profile_picture : imageUrl 
    }).then(function(){ 
     window.open('frontpage.php', '_top'); 
    }) ... 

選項2:(如果你確實需要驗證一些用戶詳細信息)

您可以檢查該用戶將被添加到數據庫中,然後顯示窗口。

喜歡的東西:

function getUserStatus(uid) { 
    return firebase.database().ref('/users/' + uid).once('value').then(function(snapshot) { 
     if (snapshot.val() != null) { 
      return snapshot.val().name; 
     } 
     return ''; 
    }); 
} 

您可以直接鏈代碼此方法:

firebase.database().ref('users/' + userId).set({ 
    name: name, 
    email: email, 
    address: address, 
    zip: zip, 
    city: city, 
    department: department, 
    membership: membership, 
    admin: admin, 
    added: currentTime, 
    profile_picture : imageUrl 
    }); 

getUserStatus(user.uid).then(function(name) { 
    if (name !== '') { 
     window.open('frontpage.php', '_top'); 
    } 
}); 
1

更新內容是異步的,並且您沒有聽取例如您正在使用的.set()。因此,在開始更新操作之後,您只需立即執行window.open(),因此如果更新需要大量的毫秒數(總是會有這樣的數量),您將在更新完成之前加載下一頁。

因此,如文檔(https://firebase.google.com/docs/database/web/read-and-write)中所建議的那樣,使用由.set()返回的承諾來確定在後端完成更新的時間,然後僅指示用戶進入下一頁。在實踐中,我猜測它應該像將window.open置於.then塊的.set一樣簡單。

雖然它看起來像你需要先做這些東西前要學會的承諾的基礎(例如https://developers.google.com/web/fundamentals/getting-started/primers/promises),我只是要給你,你應該使用模板:

somethingsomething 
    .set(...) 
    .then(function{ 
    window.open(...); 
    }); 
+0

但我已經在創建用戶功能。使用「然後」? – FeReTu

+0

是的,但沒有什麼能阻止你嵌套承諾。 (很明顯,如果你嵌套太多,它會變得很討厭,但你只有兩個)。 – Roope

+0

我編輯了試圖用代碼嘗試使用另一個的問題,但沒有存儲數據,也沒有顯示新的頁面? – FeReTu

0

set也返回一個承諾,所以你太

firebase.database().ref('users/' + userId) 
    .set() 
    .then(() => { 
    window.open('frontpage.php', '_top'); 
    }); 
+0

我用你的代碼編輯了我的問題,但沒有存儲數據,也沒有新的頁面顯示:( – FeReTu

相關問題