繁体   English   中英

变量在函数更新值之前获取输出

[英]variable getting output before it's value is updated by a function

我有以下代码,用于在$ .ajax()回调对其进行更新之前输出变量的初始化值。 尽管代码是如何编写的,但似乎在记录变量之后执行了“ 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)
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调用有机会完成之前运行。

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()文档。

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)
});

好的,我想我无法按预期进行。 我添加了一个完整的功能,但这似乎是一种解决方法。 这是合理的做法吗? 谢谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM