0

Firebase 呼び出し関数からの戻り値をグローバル変数に割り当てるのに問題があります。これは私の機能です:

  function getThePushNameById( path , id ){
    path.once( 'value', function( data ){ 
        if( data.child('id').val() != id ){
            data.forEach( function( newData ){
                var base = new Firebase( path.child( newData.name() ).toString() );
                getThePushNameById( base, id );
            })
        }else{
            //finishes the function when path is founded - returns the value
            return path.name();
        }       
    })
}

これは、リクエストを設定した別のファイルです。

var base = new Firebase(path/to/my/base);

var output = getThePushNameById( base , 2 )
console.log(output);

したがって、私の問題は、定義されるのをconsole.log待つのではなくoutput、それ自体を実行してログに記録することですundefinedconsole.logそして私の質問は、誰かがどうすれば値を待つことができるか知っているかどうかです?

4

2 に答える 2

1

JavaScript での非同期プログラミングへようこそ。

メインコードを見ると:

var output = getThePushNameById( base , 2 )
console.log(output);

次に、(論理的に)ステートメントが実行されるgetThePushNameById前に will が完了したと想定します。console.log

残念ながら、サーバーに対してプログラミングを行っている場合、その仮定は誤りです。あなたの場合getThePushNameById、Firebase に連絡しますが、完了するまでに時間がかかる場合があります。ブラウザーが呼び出しが完了するのを待つだけの場合、アプリケーション全体がブロックされます。

アプリケーションをブロックする代わりに、ブラウザはサーバーへの呼び出しをバックグラウンド アクティビティにスピンオフします。そして、バックグラウンド アクティビティが完了したときに呼び出される関数を渡します。FedEx からの配達通知にサインアップするときのようなものです。荷物がすでにそこにあるかどうか玄関で確認する代わりに、荷物が降ろされたときにテキスト メッセージを受け取ります。

この spawn-background-work-that-c​​all-call-when-call-when-re-completed アプローチは、最新の Web のほとんどに不可欠です。早い段階でそれを受け入れ、反対しようとしないのが最善です。

あなたの場合、コールバック関数を渡して、getThePushNameByIdFirebase から値を受け取ったときにその関数を呼び出すことで、それを受け入れることができます。

function getThePushNameById( path , id, callback ){
    path.once( 'value', function( data ){ 
        if( data.child('id').val() != id ){
            data.forEach( function( newData ){
                var base = new Firebase( path.child( newData.name() ).toString() );
                getThePushNameById( base, id, callback );
            })
        }else{
            //finishes the function when path is founded - returns the value
            callback(path.name());
        }       
    })
}

getThePushNameById( base, 2, function(output) {
    console.log(output);
});
于 2014-09-06T13:34:27.980 に答える