2016-06-20 23 views
1

オブジェクトを返すクエリ関数を記述したいと思います。問題は、私の場合、関数はundefinedを返します。Firebaseクエリ関数が未定義を返します

var filterDataAccordingToDate = function (ref, startTime, endTime) { 

    var filteredObj = {}; 

    ref.orderByChild('date').startAt(startTime).endAt(endTime) 
    .once('value', function(snap) { 
     filteredObj = snap.val(); 

     console.log(util.inspect(filterDataAccordingToDate(filteredObj, false, null)); 
     //Returns the correct object 

     return filteredObj; 
    }); 
} 

console.log("DATA RETURNED: " + util.inspect(filterDataAccordingToDate(travelRef, 1466439004, 1466439011), false, null)); 
// DATA RETURNED: undefined 

答えて

3

Amiには、非同期呼び出しの結果を返すことはできません。私はそれをすべてはあなたのデータをどうしたいのかに依存するとし

var filterDataAccordingToDate = function (ref, startTime, endTime) { 
    ref.orderByChild('date').startAt(startTime).endAt(endTime) 
    .once('value', function(snap) { 
     var filteredObj = snap.val(); 

     console.log(util.inspect(filterDataAccordingToDate(filteredObj, false, null)); 
     doSomethingWith(filteredObj); 
    }); 
} 

function doSomethingWith(obj) { 
    console.log("DATA RETURNED: " + util.inspect(obj, false, null)); 
} 

filterDataAccordingToDate(travelRef, 1466439004, 1466439011); 

と:あなたは何ができるか

はメソッドを使用して結果を処理し、単にリターン結果を期待せずに非同期呼び出しを直接呼び出すですそれを参照したい回数。

:私はあなたがあなたのグローバルな名前空間を汚染しないように(機能の一枚に固有の)プライベートな機能を追加することを避けるために、自己完結型の関数でスクリプトを置くことをお勧めします。 Ben Almanは、Immediately-Invoked Function Expressions(IIFE)について素敵な投稿を書いたか、JavaScript namespaceを利用することができます。

編集adolfosrsが示すように、あなたもpromisesを使用しますが、あなたがサポートしたいbrowsers何心に留めておくことができます。

2

問題はFirebaseは、したがって、あなたがコールバックから返すことはできません、データベース参照に非同期リスナーを使用していることです。

戻りオブジェクトをコールバック内の辞書に格納することができます。

2

私はプロミスと一緒に行くだろう。

var filterDataAccordingToDate = function (ref, startTime, endTime) { 
    var filterDataAccordingToDatePromise = new Promise(function(resolve, reject) { 
     ref.orderByChild('date').startAt(startTime).endAt(endTime).once('value', function(snap) { 
      filteredObj = snap.val(); 
      resolve(filteredObj); 
     }); 
    }); 
    return filterDataAccordingToDatePromise; 
}; 

filterDataAccordingToDate(travelRef, 1466439004, 1466439011).then(function(result){ 
    //this callback will be trigger when firebase call finish. 
    //result is what you set on the resolve. 
    console.log("DATA RETURNED: " + util.inspect(result, false, null)); 
}); 
関連する問題