2011-03-11 56 views
3

由於此應用程序的複雜性,我需要包裝Facebook API調用,就像這樣。從匿名函數範圍提取數據

//In main file, read is always undefined 
var read = fb_connect.readStream(); 

// In fb_wrapper.js 
function readStream() { 
    var stream; 

    FB.api('/me/feed', {limit:10000}, function (response) { 
     stream = response.data; 
    }); 

    return stream; 
} 

我知道,由於呼叫的異步性質,readStream()功能的其餘部分將返回stream(沒有值)。我很難找到一種將數據從回調函數範圍中取出並返回到更高範圍的方法。 FB API調用返回正常(我調試了它一百次),但獲取響應數據一直是迄今爲止的戰鬥。

如果有人有任何建議,將不勝感激。我搜索了一下Facebook的jQuery插件(可能是預製的包裝),但運氣不錯。

回答

2

從您的問題來看,您似乎在尋找同步呼叫。這意味着你想在調用API後立即使用從API調用返回的數據。在這種情況下,你需要檢查FB.api是否支持同步調用(通常不支持)。

否則,您需要了解您正在調用異步。這意味着您應該將處理代碼放入您傳遞給FB.api的回調函數中。這被稱爲編寫代碼的「延續」風格,並且是使用異步調用的標準方式。

FB.api('/me/feed', {limit:10000}, function (response) { 
    var stream = response.data; 
    // Do your processing here, not outside!!! 
}); 

或者:

function handlerFunction(response) { 
    // Do your processing here 
} 

FB.api('/me/feed', {limit:10000}, handlerFunction); 
+0

感謝您的答覆。真的,我正在尋找這些API調用的包裝,所以我可以有更多的面向對象的應用程序。建模如下:'app.FBAPICall()',然後能夠從這個調用中返回值。但是,我發現異步處理程序由JS線程中的最頂層對象調用,而不是由我的應用程序對象調用。 – Mark 2011-03-13 17:45:08

+0

你說得對。異步調用需要「繼續」編碼風格,與正常的過程風格完全不同。在「繼續」的風格中,你從內到外編碼。將異步JavaScript調用轉換爲同步調用並不總是很容易(或可能),因爲JavaScript是單線程的 - 正如您所提到的那樣,回調由JS線程調用,您不應該阻止。 – 2011-03-14 03:32:08