在变量的值之前得到输出的变量由函数更新

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

本文关键字:变量 输出 更新 函数      更新时间:2023-09-26

我有下面的代码,在$.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();

UPDATE:这就是我所说的使用promise的意思。有关更多信息,请参阅Deferred Object和jQuery.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)
});

好吧,我想我不能让它像预想的那样工作。我添加了一个完整的函数,但它看起来像是一种变通。这种做法合理吗?谢谢。