我希望有人可以帮助我。我在FlashBuilder 4中使用AS3具有以下功能:
protected function doIt():void
{
if (ExternalInterface.available) {
var retData:String;
retData = ExternalInterface.call("returndata");
if(retData != null) {
eidLbl.text = retData.toString();
} else {
eidLbl.text = "Returned Null";
}
} else {
eidLbl.text = "External Interface not available";
}
}
以及它调用的以下javascript函数:
var fql_query = "some query format";
function returndata(){
return fql_query;
}
当我从我的网站运行这些时,一切正常! flash文件调用javascript函数并将“some query format”返回到正确的文本字段中。
但是,如果我将我的flash功能更改为如下:
protected function doIt():void
{
if (ExternalInterface.available) {
var retData:String;
retData = ExternalInterface.call("runFQL",uidLbl.text);
if(retData != null) {
eidLbl.text = retData.toString();
} else {
eidLbl.text = "Returned Null";
}
} else {
eidLbl.text = "External Interface not available";
}
}
以及以下javascript函数:
function runFQL(id){
var user_id = id;
var page_id = "**********"; // the page id that is actually there is valid
var fql_query = "SELECT uid FROM page_fan WHERE page_id="+page_id+" and uid="+user_id;
FB.api({
method: 'fql.query',
query: fql_query
},
function(response){
if (response[0]) {
var uid = response[0].uid;
window.alert(uid); //100001632043058
return uid;
} else {
window.alert("return 1000");
}
});
};
我的问题是,当我运行这个时,它会传入id,运行查询,并准确地拉回uid并将其显示在警报中但是(这里是我的问题)它不会传回来在回报中闪现。它每次都返回null或undefined。
有谁能告诉我我错过了什么。我一直在谷歌搜索几个小时。
答案 0 :(得分:0)
function(response){
if (response[0]) {
var uid = response[0].uid;
window.alert(uid); //100001632043058
return uid;
} else {
window.alert("return 1000");
}
});
当调用runFQL时FB.api函数完成时调用。因此runFQL会一直运行并且每次都返回undefined。
你可以做的是FB.api调用完成后调用flash应用程序内的一个函数并在那里传递返回值。所以基本上在flash中执行ExternalInterface.addCallback并从javascript调用该函数。
function runFQL(id){
var user_id = id;
var page_id = "**********"; // the page id that is actually there is valid
var fql_query = "SELECT uid FROM page_fan WHERE page_id="+page_id+" and uid="+user_id;
FB.api({
method: 'fql.query',
query: fql_query
},
function(response){
if (response[0]) {
var uid = response[0].uid;
window.alert(uid); //100001632043058
// needs ExternalInterface.addCallback("sendDataBack",handleData); in your
// as3 code
yourSwf.sendDataBack(uid);
} else {
window.alert("return 1000");
}
});
};
答案 1 :(得分:0)
您的工作流程问题很小。在您的JavaScript代码中,您调用FB api然后函数结束,在这种情况下,它将返回undefined,因为没有返回任何内容。但是你认为无名函数实际上甚至没有被调用时返回的是什么,因为API甚至没有得到响应。 您需要做的是更改以下代码行。
return uid;
到
myHTMLFlashObject.someFunctionName(uid);
在你的flash项目中,你需要添加一个函数someFunctionName
并将其添加为ExternalInterface回调函数。
记住API不是异步的,所以你可以期望函数runFQL在API发送响应之前很久就返回undefined。