Apache flex 未定义Facebook API Javascript

Apache flex 未定义Facebook API Javascript,apache-flex,facebook-graph-api,Apache Flex,Facebook Graph Api,这是我遇到的一个相当普遍的问题,所以我想我会问,希望有人能帮我解决 我有一个使用facebook js bridge登录的flex应用程序,我正在尝试将用户名传递回该应用程序,但我遇到了一件事,我将在代码之后解释: function getFriends() { var nameOfPlayer = ""; FB.api('/me', function(response) { nameOfPlayer = respo

这是我遇到的一个相当普遍的问题,所以我想我会问,希望有人能帮我解决

我有一个使用facebook js bridge登录的flex应用程序,我正在尝试将用户名传递回该应用程序,但我遇到了一件事,我将在代码之后解释:

function getFriends() {
            var nameOfPlayer = "";
            FB.api('/me', function(response) {
                nameOfPlayer = response.name;
                });
            return nameOfPlayer;
        }

如果我有我的flex应用程序print nameOfPlayer,它将返回未定义,就像我使用nameOfPlayer发出警报一样,但是如果我在对nameOfPlayer的FB.api调用中发出警报,它将弹出我的名字,但它仍然不会返回名称。我试着让它返回一个通用字符串,这很有效,所以它传递了信息,只是没有保存到变量中。你知道怎么解决这个问题吗?这可能非常复杂,所以如果我需要澄清任何事情,请让我知道。提前感谢您提供的帮助:)

您在FB.api调用中定义的函数实际上是一个回调函数,这意味着它是异步调用的。因此,api调用后的代码行(return语句)将立即执行,而无需等待Facebook返回响应。另一方面,回调函数将等待Facebook的响应,事实上这就是它的设计目的。您最好执行所有依赖于回调函数中的层名称的逻辑

如果必须以编写方式返回nameOfPlayer变量,则需要告诉代码等待定义nameOfPlayer:

function getFriends() {
            var nameOfPlayer = "";
            FB.api('/me', function(response) {
                nameOfPlayer = response.name;
                });
            while(typeof nameOfPlayer === "undefined" || nameOfPlayer == "") {}
            return nameOfPlayer;
        }
但我真的不建议这样做,因为你的应用程序在等待响应时会冻结。您最好在回调函数中执行所有操作,而不是返回某些内容


祝你好运!:)

您应该以事件驱动的方式执行此操作。下面编写了一些伪代码来帮助您开始

var yourFacebookAPIClass = new yourFacebookAPIClass();
yourFacebookAPIClass.addEventListener(Event.UserCallComplete, function(ev){
    var nameOfPlayer = SomeParser.ParseData(ev);
    someFunctionThatUsesYourVar(nameOfPlayer);
});
yourFacebookAPIClass.getNameOfPlayer();

在您的facebook api类中:

function getNameOfPlayer(){
    makeTheApiCallHere();
}

谢谢,这就是我所想的,因为我在其他地方看到了,但我不知道如何修复它,如果你不介意我问的话,你会建议如何在回调中执行所有操作?是的,使用nameOfPlayer变量最可靠的方法是在回调中。如果不想在该函数中保留太多逻辑,可以将nameOfPlayer变量传递给另一个函数,但仍然需要从回调函数中调用该函数,以确保正确定义该函数。