2016-09-12 7 views
-1

これは私のコードです:関数が配列を返さないのはなぜですか?

document.getElementById('revealUser').onclick = displayDaUsers 

function displayDaUsers(){ 
    pullAllUsersFromDB(); 
    debugger; 
} 


function pullAllUsersFromDB(){ 
    rootRef.child('users').on('value', function(snapshot) { 
    var users_array = []; 
    var users_object = snapshot.val(); 
    Object.keys(users_object).map(function(key) { 
     users_array.push(users_object[key]); 
    }); 
    // window.dateApp.allUsers = users_array; 
    return users_array 
    }); 
} 

HTML:

<input type="submit" id="revealUser" value="reveal user"> 

私はこの問題を確認するには、デバッガを置くが、それは解決しません。私はusers_array でコンソールと型に行くとき、私はUncaught ReferenceError: users_array is not defined(…)

NEW CODE(EDIT)を取得:

これは動作するはず別のstackoverflowの答えによると...

function displayDaUsers(){ 
    var test = pullAllUsersFromDB(); 
    console.log(test); 
    //pullAllUsersFromDB(); 
    //debugger; 
    //setUpFirstUser() 
} 


function pullAllUsersFromDB(){ 
    rootRef.child('users').on('value', function(snapshot) { 
    var users_array = []; 
    var users_object = snapshot.val(); 
    Object.keys(users_object).map(function(key) { 
     users_array.push(users_object[key]); 
    }); 
    //window.dateApp.allUsers = users_array; 
    return users_array 
    }); 
} 
+0

これは関数内で宣言されています(ローカルスコープ)。コンソールからはアクセスできません。 –

+0

'users_array'はローカル変数であり、関数呼び出しの戻り値を捕まえることはありません。 –

+0

しかし、私はその機能の中でアクセスできることを意味するデバッガを入れましたか? @FastSnail – Waterman1

答えて

0

戻り値users_arrayがあります匿名コールバック関数function(snapshot) {...の範囲にローカル。言い換えれば、その値はその範囲外で失われます。

ロジックのどの時点でuser_arrayにアクセスする必要がありますか?関数のコンテキスト外でアクセスする必要がある場合は、スコープの大きい変数を定義してから、その値を無名関数に設定することは理にかなっています。例えば。

document.getElementById... 
var arr; 

... 

function pullAllUsersFromDB() { 
    ... 
    ...function(snapshot) { 
     arr = users_array; 
    }); 
} 

// pullAllUsersFromDB() (and its callback) must be called for arr to be defined at this point in execution 
+0

他のメソッド 'displayDaUsers'からアクセスできるようにする必要があります。それは不可能ですか? – Waterman1

+0

その場合、 'displayDaUsers'がアクセスできるコールバック値として' users_array'を渡すのが理にかなっています。したがって、 'pullAllUsersFromDB'はコールバックパラメータで拡張されるべきです。 – LINKIWI

+0

そうですね? 'pullAllUsersFromDB'とはどのような議論があり、他の関数の中でどのように見えるでしょうか? (私はあなたに私のためにそれをするよう求めていません、このタイプのスコープがどのように働くかを学ぶ必要があります) – Waterman1

関連する問題