JavaScript对象超出范围

时间:2013-09-17 11:25:40

标签: javascript jquery

namespace.items.Load = function (arg1, arg2) {
    $.getJSON("/Object/Items", { "Arg1": arg1, "Arg2": arg2 }, function (Items) {
        return Items;
    });
}

上述对象“项目”是否超出范围或某事?因为在调用这个函数之后我得到的都是“未定义的”。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

getJSON请求是异步的,因此您还必须向items.Load函数提供回调。

namespace.items.Load = function (arg1, arg2, callback) {
    $.getJSON("/Object/Items", { "Arg1": arg1, "Arg2": arg2 }, callback);
};

答案 1 :(得分:1)

$ .getJSON实现了promise接口,所以你应该能够这样做:

namespace.items.Load = function (arg1, arg2) {
  return $.getJSON("/Object/Items", { "Arg1": arg1, "Arg2": arg2 });
}

namespace.items.Load().then(function (items) {
  console.log(items);
});

答案 2 :(得分:1)

首先,return函数中没有Load语句。在这种情况下,默认情况下它将返回undefined。到目前为止没有任何意外,但我想你更愿意这样做:

namespace.items.Load = function (arg1, arg2) {
    return $.getJSON(
        "/Object/Items", 
        { "Arg1": arg1, "Arg2": arg2 }, 
        function (Items) { return Items; }
    );
}

那就是说,请记住,幕后有一个Ajax调用导致这种情况:

  1. 调用加载函数。
  2. 将Ajax请求发送到远程服务器。
  3. 加载函数返回。
  4. 发送回Ajax响应。
  5. function (Items) { return Items; }被召唤。
  6. 您期望Load函数返回的内容显然不是Items。因此,您可以使用此类解决方案:https://stackoverflow.com/a/18793057/1636522

答案 3 :(得分:0)

AJAX方法立即返回,因此将返回undefined。如果要使用那些“项目”结果,例如将它们分配给可由命名空间中的其他函数访问的变量,则需要指定回调函数。

namespace.itemList = {};

namespace.items.Load = function (arg1, arg2) {
$.getJSON("/Object/Items", { "Arg1": arg1, "Arg2": arg2 }, function (Items) {
    namespace.itemlist = JSON.parse(Items);
});
}