【问题标题】:Access json data outside of $.getJSON()访问 $.getJSON() 之外的 json 数据
【发布时间】:2014-01-21 17:09:46
【问题描述】:
$(document).ready(function () {
    var value = getParmsVals()["search"];
    $.getJSON('/api/search/GetQuestionByKey/' + value, function (jsonData) {
        $(jsonData).each(function (i, item) {
            var name = getAuthorName(item.userId);
        });
    });
});

function getAuthorName(userId) {
    var fullname = "default";
    $.getJSON('/api/search/GetUserById/' + userId, function (jsonData) {
        fullname = jsonData.firstname + " " + jsonData.lastname;
    });
    return fullname;
}

我正在尝试通过调用 getAuthorName 方法来访问全名变量,但我无法获得正确的值。它总是给我“默认”的价值。

【问题讨论】:

  • 您是否收到任何控制台错误?
  • 你能给我们看看你的 jsonData 输出吗?
  • $.getJSON 是异步的。在$.getJSON 收到回复之前,您正在返回fullname

标签: jquery asp.net json


【解决方案1】:

您不会使用异步方法return,正如您所看到的,它不起作用!你需要的是一个回调函数,考虑一下:

function getAuthorName(userId, callback) {
    var fullname = "default";
    $.getJSON('/api/search/GetUserById/' + userId, function (jsonData) {
        fullname = jsonData.firstname + " " + jsonData.lastname;
        callback(fullname);
    });
}

注意我们如何传入callback,然后在您的get 调用结束时调用它?现在像这样调用这个方法:

getAuthorName(userID, function(name) {
    console.log(name);
});

现在您可以在该回调函数中访问fullname

【讨论】:

  • 他不能也设置async: false吗?不管怎样,我更喜欢你的回答。
  • @MagicMan -- 将 async 设置为 false 绝不是一个好主意,如果该服务关闭,该调用将挂起,锁定用户。用户讨厌这样!
  • @MagicMan 你永远不应该设置 async:false 总是有更好的方法来做到这一点。
  • @b1tsh1ft 除非您在 onbeforeunload 中,或者您不想阻止的锚标记点击,或者您不想阻止的表单提交。有很多用例,使用它不是一个坏主意,这不是其中之一。
  • @tymeJV 感谢您的回答。所以如果我必须多次使用 $.getJSON() 方法,有没有更好的方法来调用它?除了在不同的函数中调用它??
【解决方案2】:

我喜欢@tymeJV 的回答,这个问题很容易解决

我只是想指出,解决在 Javascript 中易于访问数据的大局是存在以数据为中心的 JS 框架的一个重要原因

http://knockoutjs.com/ http://backbonejs.org/ http://angularjs.org/

【讨论】:

    【解决方案3】:

    您也可以将变量放在对象上并使用.bind(),如下所示:

    this.fullname = "default";
    
    $.getJSON('/api/search/GetUserById/' + userId, function (jsonData) {
       this.fullname = jsonData.firstname + " " + jsonData.lastname;
    }.bind(this));
    

    【讨论】:

      猜你喜欢
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-06
      相关资源
      最近更新 更多