2017-02-20 12 views
0

我想將數據返回到調用具有Firebase代碼的函數的函數,因爲它不是異步和嵌套的Firebase查詢結構能返回值,我打算用這樣的邏輯來設置工具提示中chart.js之如何使firebase中的函數(子快照)中設置的函數返回數據

這裏是我的代碼:

window.onload = function() { 
    get_data(); 
} 

function get_data() { 
    var data = get_val(); 
    console.log("...." + data); 
} 

function get_val() { 
    var label = "10/2/2017"; 
    var Name = localStorage.getItem("VName"); 
    console.log("Name:::" + Name); 
    var at_val; 
    var dbref = new Firebase("https://apraisalstaging.firebaseio.com/EmployeeDB/EInfo/"); 
    dbref.once("value").then(function(snapshot) { 
     snapshot.forEach(function(childsnapshot) { 
      var data = childsnapshot.val(); 
      var Nameval = data.Name; 
      if (Nameval == Name) { 
       console.log("Success"); 
       Ikey = childsnapshot.key(); 
       console.log("Key:::" + Ikey); 
       var dxRef = new Firebase("https://apraisalstaging.firebaseio.com/EmployeeDB/EApraise/" + Ikey); 
       dxRef.once("value").then(function(snapshot) { 
        snapshot.forEach(function(childsnapshot) { 
         var data = childsnapshot.val(); 
         console.log(data); 
         if (label == data.Dateval) { 
          console.log("-------> bingo"); 
          at_val = data.Attitude; 
          console.log("got value:" + at_val); 
         } 
        }); 
       }).then(function() { 
        console.log("In then:" + at_val); 
        return at_val; 
       }); 
      } 
     }) 
    }) 
} 

回答

0

數據從數據庫火力地堡的異步加載。您無法返回尚未加載的現在的值。直到asyncawait關鍵字很常見,您不能讓JavaScript等待異步值。

您今天可以得到的最接近的是從get_val()返回承諾。然後調用代碼將是:

get_val().then(function(data) { 
    console.log("...." + data); 
}); 

要做到這一點,你必須實現get_val()爲:

function get_val() { 
    var label = "10/2/2017"; 
    var Name = localStorage.getItem("VName") || "delta"; 
    console.log("Name:::" + Name); 
    var at_val; 
    var dbref = firebase.database().ref("EmployeeDB/EInfo/").orderByChild("Name").equalTo(Name); 
    return dbref.once("value").then(function(snapshot) { 
    var promises = []; 
    snapshot.forEach(function(childsnapshot) { 
     var data = childsnapshot.val(); 
     var Nameval = data.Name; 
     Ikey = childsnapshot.key; 
     var dxRef = firebase.database().ref("EmployeeDB/EApraise/" + Ikey).orderByChild("Dateval").equalTo(label); 
     promises.push(
     dxRef.once("value").then(function(snapshot) { 
      snapshot.forEach(function(childsnapshot) { 
      var data = childsnapshot.val(); 
      at_val = data.Attitude; 
      }); 
     }).then(function() { 
      console.log("In then:" + at_val); 
      return at_val; 
     }) 
    ); 
    }) 
    return Promise.all(promises); 
    }) 
} 

我做出get_val()一些改動:

  • 它使用Firebase SDK的新版本3.x。解決方案也可以使用2.x,我只是不想爲此設置一個jsbin。

  • 它填充承諾的一個列表,其中每個EApraise記錄

  • 它返回時,所有的EApraise記錄加載解析的承諾。

  • 它使用Firebase查詢來查找正確的記錄。這消除了檢查then()回調中值的需要。但更重要的是它確保只下載必要的數據。

爲了使最後一點真實的,你需要在添加一些索引定義的規則你Firebase Database console

{ 
    "rules": { 
    "EmployeeDB": { 
     "EInfo": { 
      ".indexOn": "Name" 
     } 
     "EApraise": { 
     "$eid": { 
      ".indexOn": "Dateval" 
     } 
     } 
    } 
    } 
} 

這裏與工作代碼jsbin:http://jsbin.com/jawamilawo/edit?js,console

+0

偉大的解決方案! –

+0

這種方法和語法很難包含在使用chart.js的工具提示回調中,可以使用任何解決方法 –

+0

此代碼正在返回一個對象,需要對其進行哪些更改才能返回變量,現在它的顯示對象[promise]與工具提示 –

相關問題