Ajax回调。不明白ajax回调

时间:2013-10-19 23:30:58

标签: javascript ajax

我从文件中获取数据,在这种情况下它是/notes.html。我试图将ajax调用的结果存储在一个变量中,但它一直返回undefined,但是当我在chrome developer工具中运行该函数时,它返回/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并将其变为return,然后console.log ajax.fetch调用,则会定义未定义。

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

页面为here。它是一个空白页面,但您可以在控制台中看到它打印出的代码与上面的代码。

2 个答案:

答案 0 :(得分: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 deferred object
  9. 成功回调称为
  10. 传递回调称为
  11. 成功回调返回(无法捕获返回值,因为fetch已在8中返回)
  12. done回调是代码(在这里你可以使用你所获取的数据,这要归功于闭包)

答案 1 :(得分:0)

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

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;