【发布时间】:2010-07-28 23:32:52
【问题描述】:
这对我来说太奇怪了。所以如果我不这样做
function BindAlbumAndPhotoData()
{
// Get an array of all the user's Albums
var aAlbums = GetAllAlbums(userID, token);
alert("aAlbums: " + aAlbums);
if (aAlbums == null || aAlbums == "undefined")
return;
// Set the default albumID
var defaultAlbumID = aAlbums[0].id;
};
所以我在 var defaultAlbumID = aAlbums[0].id; 行上得到一个未定义的错误。如果我不取消注释警报("aAlbums: " + aAlbums);
什么鬼?如果我注释掉 alert("aAlbums: " + aAlbums);然后我得到一个未定义的 var defaultAlbumID = aAlbums[0].id;
这太奇怪了。我整晚都在努力找出为什么我一直在为 aAlbum[0] 得到一个未定义的结果,并且一旦我添加了一个我曾经在它之上的警报,一切都很好......对我来说毫无意义.
GetAllAlbums 的完整代码如下:
function GetAllAlbums(userID, accessToken)
{
var aAlbums = []; // array
var uri = "/" + userID + "/albums?access_token=" + accessToken;
alert("uri: " + uri);
FB.api(uri, function (response)
{
// check for a valid response
if (!response || response.error)
{
alert("error occured");
return;
}
for (var i = 0, l = response.data.length; i < l; i++)
{
alert("Album #: " + i + "\r\n" +
"response.data[i].id: " + response.data[i].id + "\r\n" +
"response.data[i].name: " + response.data[i].name + "\r\n" +
"response.data[i].count: " + response.data[i].count + "\r\n" +
"response.data[i].link: " + response.data[i].link
);
aAlbums[i] = new Album(
response.data[i].id,
response.data[i].name,
response.data[i].count,
response.data[i].link
);
alert("aAlbums[" + i + "].id : " + aAlbums[i].id);
}
});
return aAlbums;
}
所以在我点击 FB.api 异步调用的回调之前我不会返回数组,所以我看不到我的 defaultAlbumID = aAlbums[0].id;在我返回一个有效的数据数组之前执行代码行。当我发出警报时,它在到达我的线路 defaultAlbumID = aAlbums[0].id; 之前会延迟。导致它我猜幸运的是有数据,因为异步 FB.api 调用已经完成,但是当我在继续之前等待调用并将数组返回到aAlbums 在我的 BindAlbumAndPhotoData() 方法中。
更新 #3
function BindAlbumAndPhotoData()
{
GetAllAlbums(userID, accessToken, function (aAlbums)
{
alert("we're back and should have data");
if (aAlbums === null || aAlbums === undefined) {
alert("array is empty");
return false;
}
var defaultAlbumID = aAlbums[0].id;
// Set the default albumID
var defaultAlbumID = aAlbums[0].id;
// Bind the album dropdown
alert(" defaultAlbumID: " + defaultAlbumID);
});
};
function GetAllAlbums(userID, accessToken, callbackFunctionSuccess)
{
var aAlbums = []; // array
var uri = "/" + userID + "/albums?access_token=" + accessToken;
FB.api(uri, function (response)
{
// check for a valid response
if (!response || response.error)
{
alert("error occured");
return;
}
for (var i = 0, l = response.data.length; i < l; i++)
{
alert("Album #: " + i + "\r\n" +
"response.data[i].id: " + response.data[i].id + "\r\n" +
"response.data[i].name: " + response.data[i].name + "\r\n" +
"response.data[i].count: " + response.data[i].count + "\r\n" +
"response.data[i].link: " + response.data[i].link
);
aAlbums[i] = new Album(
response.data[i].id,
response.data[i].name,
response.data[i].count,
response.data[i].link
);
alert("aAlbums[" + i + "].id : " + aAlbums[i].id);
}
// pass the array back to the callback function sent as a param to the GetAllAlbums method here
callbackFunctionSuccess(aAlbums);
});
}
它没有在回调中触发我的警报。我一定还是在这里做错了。
更新 #4 - 由于某种原因,它现在没有触发我的 FB.api 回调。
function GetAllAlbums(userID, accessToken, callbackFunctionSuccess)
{
var aAlbums = []; // array
var uri = "/" + userID + "/albums?access_token=" + accessToken;
alert("uri: " + uri);
FB.api(uri, function (response)
{
// check for a valid response
if (!response || response.error)
{
alert("error occured");
return;
}
for (var i = 0, l = response.data.length; i < l; i++) {
alert("Album #: " + i + "\r\n" +
"response.data[i].id: " + response.data[i].id + "\r\n" +
"response.data[i].name: " + response.data[i].name + "\r\n" +
"response.data[i].count: " + response.data[i].count + "\r\n" +
"response.data[i].link: " + response.data[i].link
);
aAlbums[i] = new Album(
response.data[i].id,
response.data[i].name,
response.data[i].count,
response.data[i].link
);
alert("aAlbums[" + i + "].id : " + aAlbums[i].id);
}
alert("about to pass back the array to the callback function");
// pass the array back to the callback function sent as a param to the GetAllAlbums method here
callbackFunctionSuccess(aAlbums);
});
}
【问题讨论】:
-
你可能在这里做 ajax (
GetAllAlbums(userID, token);),不是吗? -
GetAllAlbums(userID, token);是做什么的? -
是的...但我还是不明白。
-
GetAllAlbums 调用 JS SDK ajax 来获取专辑并返回自定义专辑对象数组
-
是的,这是一个典型的迹象,表明您的脚本正在尝试处理尚未(完全)加载的内容。
标签: javascript