javascript – 如何在回撥函式之外使用FB.api(JS SDK)響應?
我沒有登入或甚至呼叫api的任何問題,我只是在api回撥之外獲得響應的問題.我知道它非同步執行,所以我想把它放在一個返回響應的函式中.這是我的想法
//What I would like to be able to do function fbUser(){ FB.api('/me', function(response){ //this logs the correct object console.log(response); }); //How do I get the response out here? return response; }
我想在開始時呼叫/ me api函式,然後將它傳遞給我的檢視物件(我只是使用Backbone檢視中的響應),並根據需要使其他api呼叫.我目前通過從回撥內部呼叫檢視來確定某些事情
//What I am doing now, but I lose the ability to pass anything other than the //the current response to this function/View FB.api('/me', function(response){ var newView = new facebookView({model: response}); });
我原來正在嘗試這個,但是由於api呼叫是非同步的,我遇到的問題是未定義的
//What I started with but had async issues var fbResponse; FB.api('/me', function(response){ fbResponse = response; }); //I would then try and use fbResponse but it would be undefined
當我第二次失去第一個迴應.例如我的第一個api電話是/ me來獲取使用者資訊.我可以呼叫/ your-fb-id /照片並獲取照片,但是如果我打電話給照片api回撥內的另一個功能,我只能引用那個回覆我失去了原始/我的回覆.如果我可以從回撥中獲得響應,那麼我可以根據需要傳遞.我明白響應只在回撥內有效,那麼如何使它在回撥之外有效,同時考慮到它是非同步的?
大家好,我想出了這一點.花了我很長時間,閱讀了許多不同的頁面.我說我想做所有的處理回撥和關閉.我將首先介紹回撥問題.因為FB.api函式是非同步的,所以你永遠都不知道什麼時候返回.你可以停止Javascript或設定一個計時器,但這是一個可怕的方式來做到這一點.你需要一個回撥.實際上FB.api正在使用回撥.這就是第二個引數的匿名函式.我所做的是建立一個名為fbUser的函式,並使用回撥函式.這是我做的:
function startThis() { var getUser = fbUser(function(model){ console.log(model); startapp(model); }); }; function fbUser(callback){ FB.api('/me', function(response){ callback(response); }); }
startThis函式在積極的Facebook身份驗證響應中呼叫.然後呼叫具有回撥的fbUser函式.回撥從FB.api函式返回回撥.因為startThis使用返回值被稱為model的回撥函式,所以在回撥函式返回之前,其他程式碼將不會執行.沒有更多的未定義的問題.這些功能只是包裝器,可以讓Facebook迴應我的觀點.我可能添加了一個太多的抽象層,但是如果你想繞過響應,那就是這樣.
其次我想把這個迴應傳遞給另一個觀點.例如,一個檢視載入基本資訊(使用fbUser的響應).我現在想把它傳遞給另一個載入照片的檢視(我知道這不是MVC的最佳實踐,但是通過使用Facebook,我對模型沒有太多的控制).我曾經遇到過的問題是,我無法將原始響應傳遞給下一個檢視,因為FB.api呼叫的回撥函式內部是指Window,而不是我所在的物件.解決方案:closures.我不會完全解釋這一點,但是閉包是函式內部的一個區域性變數,它在匿名函式中仍然有一個引用.這是我的解決方案,應該說明我在說什麼:
photos: function(){ var This = this; var apiString = '/' + this.model.id + '/photos'; FB.api(apiString, function(response){ loadPhoto(response,1, This.model); });
函式loadPhoto是載入照片檢視的包裝器(我知道骨幹可以幫助我載入不同的檢視,但是我一次處理一個問題).它將照片api呼叫作為模型,數字作為偏移量和origanl響應.此函式中的第一行將其設定為區域性變數This.這允許我在匿名回撥函式中引用被呼叫的物件.
我希望這可以幫助一個人,因為我花了很多時間和大量的測試時間來找到解決方案.如果您不知道回撥或關閉如何工作,很難找到您要查詢的資訊.
http://stackoverflow.com/questions/7652558/how-do-i-use-an-fb-apijs-sdk-response-outside-of-the-callback-function