【发布时间】:2012-07-14 15:23:18
【问题描述】:
目前正在使用以下代码从 YouTube 上的搜索中获取第一个视频,但是当调用 docready 时,未设置 ID。代码不会等待 ajax 结果返回,而是继续执行,不返回任何内容。
我用 ajax 尝试了 async:false,认为它可能会使其“等待”,但仍然没有返回任何内容。我将如何解决这个问题以便设置所有 id?
$(document).ready(function () {
docready();
});
function docready() {
var id1 = grabid("cat");
var id2 = grabid("dog");
var id3 = grabid("goldfish");
alert(id1);
}
function grabid(keyword) {
var url = 'http://gdata.youtube.com/feeds/api/videos?q=' + encodeURIComponent(keyword) + '&format=5&max-results=1&v=2&alt=jsonc';
$.ajax({
async: false,
type: "GET",
url: url,
dataType: "jsonp",
success: function (responseData, textStatus, XMLHttpRequest) {
if (responseData.data.items) {
var videos = responseData.data.items;
videoid = videos[0].id;
alert(videoid);
return videoid;
}
}
});
}
更新:我刚刚更改了上面的代码,以使我的问题更清楚一点。当代码运行时,它会按预期提示真正的“videoid”3 次。但是当它到达 alert(id1) 时,它会返回 undefined - 因此“返回 videoid”会被忽略,并且不会将其传递回变量。
更新 2 仍未解决
【问题讨论】:
-
你能告诉我们最重要的部分——JSON编码的响应吗?
-
我不知道为什么这会是相关的?当我在返回之前添加 alert(videoid) 时,它会这样做,所以它可以获取数据。
-
反正......
id=grabid(keyword1)什么是keyword1?该变量是在全球其他地方设置的吗?它没有提供,也不在 docready 函数的范围内。您将变量keyword1传递给函数,该函数在组件字符串中使用keyword1。这是正确的变量吗?您还没有提供它,因此很难调试。你说response is not waiting,但是任何被正确调用的代码都会有足迹。你知道如何使用网络检查器吗?检查 XHR 请求以查看它是否已运行。如果没有,你知道breakpoints是什么吗? -
我过早地问了,因为我认为问题的标题与您的需求一致。然而,这与 API 无关,而是与让函数传递变量有关。
-
@Ohgodwhy 你是对的。但是标题的命名是为了吸引熟悉 YouTube API 并且可能对我所面临的问题有经验的人。我已经根据您的 cmets 更新了我的代码示例。我希望它有所帮助。
标签: javascript jquery youtube youtube-api youtube-javascript-api