【问题标题】:JavaScript Objects: Property Set but Returns undefined When AccessedJavaScript 对象:属性集但在访问时返回未定义
【发布时间】:2011-02-02 00:43:12
【问题描述】:

您好,

我正在使用这样定义的 JavaScript 对象:

var ytVideoData = new Object();

然后我在 jQuery .ajax() 中为其赋值:

$.ajax({
    type: "GET",
    url: "xmlproxy.php?url="+ytId+"&mode=native",
    success: function(data) {

        ytVideoData.thumbnail = $(data).find("media\\:thumbnail[yt\\:name='default']").attr("url"); // default thumbnail image
    }
});

在另一个函数中,我想访问刚刚设置的缩略图属性。但是,当我这样做时:

function addPlaylistItem(tumblrUser, videoData) {
    console.log(videoData.thumbnail);
}

我在控制台中得到的只是“未定义”。当我这样做时:

console.log(videoData);

我将整个对象记录到控制台,并且可以看到对象内部正确设置的缩略图属性,如下所示:

http://mp3.deceast.com/js-objectissue.jpg

在尝试了几种不同的方法后,我似乎无法让它发挥作用。如何访问此对象属性?

【问题讨论】:

  • 你知道异步回调是如何工作的吗?
  • 您能否展示包含 ajax 调用以及 addPlaylistItem() 调用的代码?如果您 $.ajax() 之后调用addPlaylistItem(),而不是success 回调中,则此将不起作用,因为请求是异步的。这个问题每天在 SO 上至少被问一次。
  • 您确定 ajax 调用中的成功函数在您的其他函数之前执行吗?
  • 另一件事:不需要new Object()。写var ytVideoData = {};

标签: javascript


【解决方案1】:

通过 ajax 的回调是异步的。这意味着你无法判断它何时会运行成功函数。

可能发生的顺序是

$.ajax
addPlaylistItem // undefined
success // defined

尝试在成功回发中调用函数

success: function(data) {
    ytVideoData.thumbnail = $(data).find("media\\:thumbnail[yt\\:name='default']").attr("url"); // default thumbnail image
    addPlaylistItem(getTumblrUser(), ytVideoData);
}

【讨论】:

  • 我尝试在 ajax 调用中将 async 属性设置为 false,但它的行为仍然相同。我感到困惑的部分是,当我将整个对象记录到控制台时,我可以看到属性设置正确,但是当我记录对象属性本身时,它显示为未定义。
  • @Matt:您能否发布一个重现该行为的链接,和/或更完整的代码示例来显示 ajax 调用与您尝试调用addPlaylistItem() 的方式之间的关系?您确定将正确的对象传递给addPlaylistItem()
  • @MattR 从不使用 async false。这是坏的!检查你如何不能 addPlaylistItem 它可能是一个错误
  • 看起来这是一个错误,我的代码没有结构化。我将 addPlaylistItem() 调用移到回调内部,一切都按预期运行。感谢所有这么快就加入的人,SO 是一个了不起的社区!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 2013-02-07
  • 1970-01-01
相关资源
最近更新 更多