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

上述对象“项目”是否超出范围或其他内容?因为在调用这个函数后,我得到的只是“未定义”。我怎样才能解决这个问题?

4

4 回答 4

2

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

namespace.items.Load = function (arg1, arg2, callback) {
    $.getJSON("/Object/Items", { "Arg1": arg1, "Arg2": arg2 }, callback);
};
于 2013-09-17T11:27:46.653 回答
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; }叫做。

您期望该Load函数返回的显然不是Items. 因此,您可以改用这种解决方案:https ://stackoverflow.com/a/18793057/1636522 。

于 2013-09-17T18:04:26.013 回答
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);
});
于 2013-09-17T11:31:23.653 回答
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);
});
}
于 2013-09-17T11:27:17.447 回答