[英]Error when storing variables for use in later functions
我正在嘗試使用Firebase和Twitter設置用戶身份驗證。 此答案中的代碼適用於某點:
var url = 'https://molovo-comments.firebaseio.com/';
var myDataRef = new Firebase(url);
var dataStore = (function(){
var user = null;
var auth = new FirebaseSimpleLogin(myDataRef, function(error, data) {
if (error) {
// an error occurred while attempting login
console.log(error);
} else if (user) {
// user authenticated with Firebase
user = data;
console.log('User ID: ' + user.id + ', Provider: ' + user.provider);
} else {
// user is logged out
}
});
return {
getAuth : function() {
if (auth) return auth;
// else show some error that it isn't loaded yet;
},
getUser : function() {
if (user) return user;
// else show some error that it isn't loaded yet;
}
};
})();
我可以使用dataStore.getAuth()
訪問auth變量,並將user.id登錄到控制台。 調用dataStore.getAuth().login('twitter')
也可以,並且我已重定向到Twitter登錄頁面。
但是,如果我嘗試使用dataStore.getUser().id
從外部返回用戶ID, dataStore.getUser().id
得到cannot read property 'id' of undefined
。
我認為我可能只是以錯誤的方式返回了user
,因此,如果有人可以對這個問題有所了解,我將非常感激。
更新:感謝@BenjaminWarren和@SpinyNorman的回答,我更新了代碼以使用正確的變量,如下所示:
var dataStore = (function(){
var userObj = null;
var auth = new FirebaseSimpleLogin(myDataRef, function(error, user) {
if (error) {
// an error occurred while attempting login
console.log(error);
} else if (user) {
// user authenticated with Firebase
userObj = user;
console.log('User ID: ' + userObj.id + ', Provider: ' + userObj.provider);
} else {
// user is logged out
}
});
return {
getUser : function() {
if (userObj) return userObj;
// else show some error that it isn't loaded yet;
},
getAuth : function() {
if (auth) return auth;
// else show some error that it isn't loaded yet;
}
}
})();
jQuery(document).ready(function($) {
console.log(dataStore.getUser().id);
});
控制台輸出如下所示:
Uncaught TypeError: Cannot read property 'id' of undefined main.js:37
User ID: 222936694, Provider: twitter main.js:14
因此,在返回auth對象之前已記錄dataStore.getUser().id
,因此未定義。 我在getUser()返回上嘗試了不同的setTimout值,但始終在auth
之前返回
干杯,
詹姆士
嘗試這個:
var url = 'https://molovo-comments.firebaseio.com/';
var myDataRef = new Firebase(url);
var dataStore = (function(){
var user = null;
var auth = new FirebaseSimpleLogin(myDataRef, function(error, user) {
if (error) {
// an error occurred while attempting login
console.log(error);
} else if (user) {
// user authenticated with Firebase
console.log('User ID: ' + user.id + ', Provider: ' + user.provider);
} else {
// user is logged out
}
});
return {
getAuth : function() {
if (auth) return auth;
// else show some error that it isn't loaded yet;
},
getUser : function() {
if (user) return user;
// else show some error that it isn't loaded yet;
}
};
})();
看看其他一些引用, function(error, user)
似乎是常見的格式。 您的處理方式與else if (user)
始終返回false的情況類似,因為正在傳遞data
而不是user
。
在我看來,由於user
變量從未更新,因此當前代碼根本不會記錄用戶ID。 它以null
開頭,並且僅在(...) if(user) { user = data }
,永遠無法訪問。 我認為這一行應該說} else if (data) {
相反:
var url = 'https://molovo-comments.firebaseio.com/';
var myDataRef = new Firebase(url);
var dataStore = (function(){
var user = null;
var auth = new FirebaseSimpleLogin(myDataRef, function(error, data) {
if (error) {
// an error occurred while attempting login
console.log(error);
} else if (data) {
// user authenticated with Firebase
user = data;
console.log('User ID: ' + user.id + ', Provider: ' + user.provider);
} else {
// user is logged out
console.log('Not logged in.');
user = {id: null}; // for example.
}
});
return {
getAuth : function() {
if (auth) return auth;
// else show some error that it isn't loaded yet;
},
getUser : function() {
if (user) return user;
// else show some error that it isn't loaded yet;
}
};
})();
編輯:正如本傑明·沃倫(Benjamin Warren)所指出的,這可能是由於將函數自變量的名稱從user
更改為data
以避免與先前定義的user
變量沖突而引起的。 我假設在將參數名稱也從user
更改為data
之后,日志功能也停止了工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.