变量获取输出之前它的值由函数更新

时间:2014-05-23 18:56:46

标签: javascript jquery

我有以下代码在$ .ajax()回调更新之前输出my变量的初始化值。似乎' get'在记录变量之后执行,尽管代码是如何写入的。我怎么能纠正这个?感谢您的任何建议。

var statusUpdate = {
    queries : [],
    numQueries : 0,
    getNumQueries : function(){
        $.ajax({
            type: 'get',
            url: '40985839503175/planXML.txt',
            cache: false,
            error: function()
            { 

            },
            success: function(data){
                statusUpdate.queries = $(data).find('query');
                statusUpdate.numQueries = statusUpdate.queries.length;
                //console.log(statusUpdate.numQueries);

            }

        });

        }  // end getNumQueries

};


statusUpdate.getNumQueries();
console.log(statusUpdate.numQueries)

3 个答案:

答案 0 :(得分:0)

var statusUpdate = {
    queries : [],
    numQueries : 0,
    getNumQueries : function(){
        $.ajax({
            type: 'get',
            url: '40985839503175/planXML.txt',
            cache: false,
            error: function()
            { 

            },
            success: function(data){
                statusUpdate.queries = $(data).find('query');
                statusUpdate.numQueries = statusUpdate.queries.length;
                console.log(statusUpdate.numQueries);

            }

        });

        }  // end getNumQueries

};

取消注释成功回调中的记录器。否则,日志可能会在ajax调用有机会完成之前运行。

答案 1 :(得分:0)

Ajax调用是异步的。我猜你在控制台看到0了吗?

console.log放入成功功能中。但我建议传递一个回调或返回promise对象(它需要你重构你的JavaScript)。

var statusUpdate = {
    queries : [],
    numQueries : 0,
    getNumQueries : function(){
        $.ajax({
            type: 'get',
            url: '40985839503175/planXML.txt',
            cache: false,
            error: function()
            {

            },
            success: function(data){
                statusUpdate.queries = $(data).find('query');
                statusUpdate.numQueries = statusUpdate.queries.length;

                console.log(statusUpdate.numQueries)
            }

        });

        }  // end getNumQueries

};


statusUpdate.getNumQueries();

更新:这就是我使用诺言的意思。有关详细信息,请参阅Deferred ObjectjQuery.ajax() documentation

var statusUpdate = {
    queries : [],
    numQueries : 0,
    getNumQueries : function(){
        var deferred = new $.Deferred();

        $.ajax({
            type: 'get',
            url: '40985839503175/planXML.txt',
            cache: false
        }).done(function(data){
                statusUpdate.queries = $(data).find('query');
                statusUpdate.numQueries = statusUpdate.queries.length;

                deferred.resolve();
        ).fail(function () {
            deferred.reject();
        });

        return deferred.promise();
    }  // end getNumQueries

};


statusUpdate.getNumQueries().done(function () {
    console.log(statusUpdate.numQueries)
});

答案 2 :(得分:0)

好吧,我想我无法按照设想让它发挥作用。我添加了一个完整的功能,但它似乎是一种解决方法。这是一种合理的做法吗?谢谢。