关于在闭包中使用AJAX保存数据时,不执行success回调,直接return的问题。

发布于 2022-09-04 02:59:32 字数 562 浏览 17 评论 0

var initObj = getData()();
function getData() {
  var initData;
  $.ajax({
      type: "GET",
      url: baseUrl + "Api/User/leftMenu",
      dataType: "JSON",
      async: false,
      success: function(data) {
        initData = data.data;
      }
  });
  return function() {
    return {
      get: function() {
        return initData;
      }
    }
  }
}
console.log(initObj.get())

get返回的数据为undefined;通过打断点发现有执行AJAX(设置了为同步),但是没有执行success的回调,所以initData没有被赋值;
我想请求下来的数据保存起来由于权限判断,使用闭包是为了不让人很轻易的去修改他,请问是哪里出了问题,或者有什么更好的解决办法呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

○闲身 2022-09-11 02:59:32

应该不是异步导致的,你ajax将async写成了false,成了同步模式的ajax请求,这样操作也挺少见的,这样来说你的脚本就是同步执行了,那么原因可能有:

  • ①数据问题,可能本身data.data就没有数据

  • ②Jq封装的ajax的问题,的确有听说async无效的情况,不过忘记出处了(也可能是记错了),你可以进行测试一下(结果希望能告知我一声,嘻嘻)

  • ③因为变量提升的缘故,你在调用getData()()的时候它还没有上下文,但在后面的声明中有了,这就相当于

var b = val;
val = 2;
console.log( b );//undefined

其他的原因暂时没有想到

茶花眉 2022-09-11 02:59:32

按照你写的方法,即使AJAX成功也不能保证返回接口不会被修改,因为你get返回的数据是个JSON对象。最好只返回你感兴趣的数据,比如get: function() { return initData.isRoot; }

唯憾梦倾城 2022-09-11 02:59:32

写的太复杂了,可读性很差。
success是异步方法, 你给 initObj 这个对象赋值的时候initData当然是没有值的,initData根本不在你所谓的闭包里面,闭包是

return function() {
    return {
      get: function() {
        return initData;
      }
    }
}

这个function里面,这里面啥都没有,susccess回调跟这是两个闭包。

你就理解success是回调,数据是异步获取的,获取到的操作只能在回调里操作就行了,根本不用考虑谁回去修改的问题,每次都发请求去请求新的数据别人怎么改。

我猜测你是想做一个登录模块,那你应该把这个东西理解为一个模块,这个模块有一个方法叫做getUserInfo,这个模块保存了一个内部变量就是用户信息,这个用户信息就是私有变量,改不了,同时这个模块可以做一个缓存,第一次调getUserInfo的时候发送ajax请求,拿到数据后存起来,再调用getUserInfo的时候,如果有数据就不发请求,从私有变量里拿。

编程是往符合人类思维习惯的方向去写,而不是为了适应机器去改变人类思维习惯。

烟火散人牵绊 2022-09-11 02:59:32

因为ajax是异步的而你直接拿了还没被ajax异步函数赋值的变量出来。异步不用回调你是不知道什么时候才拿到数据的。

北座城市 2022-09-11 02:59:32

简单的来不就得了。搞这么复杂

function abc(){
    var initObj;
      $.ajax({
          type: "GET",
          url: baseUrl + "Api/User/leftMenu",
          dataType: "JSON",
          async: false,
          success: function(data) {
            initObj = data;
          }
      });
    return initObj;
}
console.log(abc());

clipboard.png

clipboard.png

宫墨修音 2022-09-11 02:59:32

谢邀。如果没有执行succes回调,确保请求没写错的基础上,看看是不是服务端出问题了?打开控制台Network看看。success对应的error方法最好也加上。

成熟的代价 2022-09-11 02:59:32

代码是肯定没有问题的,请再确认一下data.data的值。(平时调试的时候,chrome多注意Network显示的响应内容)

$.ajax({
    type: "GET",
    url: baseUrl + "Api/User/leftMenu",
    dataType: "JSON",
    async: false,
    success: function(data) {
        // 关键是这个 data.data 到底是不是 undefined
        initData = data.data;
    }
});
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文