簡體   English   中英

存儲變量供以后的函數使用時出錯

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM