火狐浏览器调试工具Firebug显示Javascript函数返回undefined

3
可能重复:
如何从函数返回AJAX调用的响应? 在我的App命名空间中,我刚刚定义了一个函数:
版本1
window.App = {
  isLogged: function () {
    $.get('/user/isLogged', function (data) {
      if (data == 'true') {
        return true;
      }
      return false;
    });
  }
};

版本 2

window.App = {
  isLogged: function () {
    var test = $.get('/user/isLogged');
    console.log(test.responseText);
  }
};

在版本1中,当我在Firebug上尝试使用“App.isLogged()”函数时,会得到一个模糊的未定义值:S。
在版本2中,当我在Firebug上尝试使用该函数时,responseText似乎是未定义的:stuck:
我对JavaScript还不太了解,可能是作用域问题...
我认为我的函数目标很明确,有更好的方法实现吗?

5
AJAX是异步的。非常重要的是要理解这意味着什么。在搜索中可以找到很多解释。 - charlietfl
使用Firebug网络选项卡查看请求的实际结果。它将告诉您状态代码(例如404未找到,500内部服务器错误,200 OK)和响应(如果适用)。 - Paul Fleming
@FelixKling 感谢你提醒异步行为。 - Christopher Chiche
1
你的 App.isLogged 没有返回任何内容。在你的 #1 选项中,所有的 return 只是从 .get() 的内部处理函数中返回,而不是从 App 函数中返回。 - Hieu Le
哇,这个即时评论真棒!顺便说一下,服务器的响应很好:200 - “true”,我会先看@Felix Kling的链接... - cl0udw4lk3r
显示剩余3条评论
1个回答

2

在第一个版本中,$.get 是异步的,这就是为什么你没有得到返回值。

在第二个版本中,$.get 返回的是延迟对象,它没有 responseText 字段。

window.App = {
  isLogged: function () {
    var dfd = $.Deferred();
    $.get('/user/isLogged', function (data) {
      if (data == 'true') {
        return dfd.resolve();
      }
      return dfd.reject();
    });
    return dfd.promise();
  }
};

$.when(App.isLogged()).then(function() {
  //your code
}).fail(function() {
  //fail code
});

1
你不需要创建自己的延迟对象,只需返回$.get返回的内容即可。 - Felix Kling
@Felix Kling 没错,你是对的。有许多代码版本都可以运行。 - salexch
哦,等等……如果你正在成功回调函数内进行测试,那么使用自己的测试工具是有意义的。抱歉,忽略我的第一条评论。 - Felix Kling
@Felix Kling :) 移除编辑.. - salexch
嗯,我认为这是我的“版本2”的答案,@FelixKling在链接上已经很好地回答了版本1,给Felix点赞,也感谢@salexch的回答! - cl0udw4lk3r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接