0

我正在从文件中获取数据,在本例中是/notes.html. 我试图将 ajax 调用的结果存储在一个变量中,但它一直返回未定义,但是当我在 chrome 开发人员工具中运行该函数时,它返回/notes.html. 这是我修改以记录数据的简单代码:

    var ajax = {};
    ajax.result = Array();
    ajax.fetch = function(urls,datas){
        $.ajax({
            url: urls,
            type: 'post',
            data: datas,
            success: function(data){
                console.log (data);
            }
        });
    }
    ajax.fetch('/notes.html',{});

这就是我要说的。如果我们将console.log其更改为 a return,然后调用,我们console.logajax.fetch得到未定义。

当我保存它ajax.result然后在chrome dev中调用它时。工具,内容显示在 chrome dev 中。工具,但我不能在基本 javascript 中使用它。

页面在这里。这是一个空白页,但您可以在控制台中看到上面的代码打印出的内容。

4

2 回答 2

2

ajax 本质上是一个延迟调用,所以从函数返回什么并不重要,原来的 fetch 已经退出并在不久前返回 undefined ......

您可以将回调传递给 fetch 以解决此问题:

var ajax = {};
var result;
    ajax.result = Array();
    ajax.fetch = function(urls,datas, callback){
        return $.ajax({
            url: urls,
            type: 'post',
            data: datas,
            success: function(data){
                callback(data);
            }
        });
    }
    ajax.fetch('/notes.html',{}, function (data) {
        // execute result related code here to ensure variable already assigned
    });

如果您进行跟踪,您将获得以下执行:

  1. ajax 被声明
  2. 结果被宣布
  3. ajax 设置为{}
  4. ajax.result 设置为一个新数组(顺便说一句,您应该使用 [] 而不是 Array 以避免潜在的原型疯狂)
  5. ajax.fetch 设置为函数
  6. ajax.fetch 被调用,匿名函数作为回调
  7. $.ajax 被称为
  8. ajax.fetch 返回(这是你 undefined 的来源,现在它将返回一个 jQuery延迟对象
  9. 调用成功回调
  10. 调用传递的回调
  11. 成功回调返回(无法捕获返回值,因为 fetch 已经在 8 中返回)
  12. done回调是代码(由于闭包,您可以在这里使用获取的数据)
于 2013-10-19T23:38:46.980 回答
0

对 $.ajax() 的调用在发出请求后立即返回,因为它默认以异步模式运行。$.ajax 调用的返回值不是成功函数的返回值。开启同步行为:

ajax.fetch = function(urls, datas)
{
  result = null;
  $.ajax({ url: urls,
           type: 'post',
           data: datas,
           async: false,
           success: function(data) { result = data; } });
  return result;
}

或者只是这样做:

$.ajax({ url:   urls,
         type:  'post',
         data:  datas,
         async: false }).responseText; 
于 2013-10-19T23:41:20.447 回答