我正在从文件中获取数据,在这种情况下,它是/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并将其设置为return,然后将其更改为console.log ajax.fetch调用,则将无法定义。

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

页面为here。它是空白页,但是您可以在控制台中看到上面的代码所显示的内容。

最佳答案

ajax本质上是一个延迟调用,因此从该函数返回的内容并不重要,原始获取已退出并在不久前未定义返回...

您可以将回调传递给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
    });


如果进行跟踪,将执行以下操作:


宣布ajax
结果被宣布
ajax设置为{}
ajax.result设置为新数组(顺便说一句,您应该使用[]而不是Array以避免潜在的原型疯狂)
ajax.fetch设置为函数
调用ajax.fetch,并使用匿名函数作为回调
$ .ajax被称为
ajax.fetch返回(这是您未定义的来源,现在它将返回一个jQuery deferred object
成功回调称为
传递的回调称为
成功回调返回(由于已在8中返回,因此无法捕获返回值)
done回调是代码(在这里,由于闭包,您可以使用获取的数据)

09-18 07:33