2014-09-06 101 views
0

我在將Firebase調用函數的返回值分配給我的全局變量時遇到了麻煩。這是我的函數:javascript從回調返回(定時)賦值給變量

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來定義,但它本身運行並記錄undefined。而我的問題是,如果有人知道我怎麼能讓console.log等待價值?

回答

0
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); //here was the error 
      }) 
     }else{ 
      //finishes the function when path is founded - returns the value 
      callback(path.name()); 
     }  
    }) 
} 

getThePushNameById(base, 2, function(output) { 
    console.log(output); 
}); 

創辦了一個錯誤:回調不當函數再次調用它自己時返回定義,所以它返回一個未定義的。這段代碼現在好了,效果不錯

1

歡迎使用JavaScript進行異步編程。

當我們在看你的主要代碼:

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

然後你(邏輯)假設執行console.log語句之前getThePushNameById都將完成。

不幸的是,當我們針對服務器編程時,假設是錯誤的。在你的情況下,getThePushNameById與Firebase聯繫,可能需要很長時間才能完成。如果瀏覽器只是等待電話完成,整個應用程序將被阻止。

瀏覽器不會阻止應用程序,而是將服務器調用轉換爲後臺活動。你傳入一個函數,當後臺活動完成時它會調用它。這就像您在註冊FedEx的投遞通知時一樣。如果包裹已經在那裏,不必檢查前門,當包裹丟失時,您會收到一條短信。

這種spawn-background-work-that-c​​alls-you-back-when-it-done-done方法對於大多數現代網絡都是至關重要的。你最好儘早擁抱它,而不是試圖反對它。

你的情況,當你從火力地堡獲得的價值,你可以擁抱它,通過傳遞一個回調函數到您getThePushNameById和調用該函數:

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); 
}); 
+0

爲什麼我的bug報告者報告[Error] TypeError:undefined不是函數(評估'callback(path.name)')如果我將相同的代碼粘貼到我的? – maticzav 2014-09-06 16:10:43

+0

不幸的是,我無法爲你調試你的應用程序。我建議在這一行'callback(path.name());'上設置一個斷點,看看會發生什麼。 – 2014-09-06 16:21:54

+1

我找到了!當函數再次調用它時,它在代碼中是不好的。回調未定義 – maticzav 2014-09-06 18:11:24