JavaScript 与 jQuery 异步返回值/赋值

标签 javascript jquery asynchronous

我有以下 jQuery 函数。我试图返回 alert(); 中显示的 GUID 值警报工作正常并且值已填充,但是我似乎无法将其分配给变量并返回其值。

最终我需要访问其他函数中的GUID值等。我尝试过的所有内容都仅显示为undefined .

我想做这样的事情:

function trackPage(){
    var elqTracker = new jQuery.elq(459);
    elqTracker.pageTrack({
        success: function() {
            elqTracker.getGUID(function(guid) {
                alert(guid);
                var returnValue = guid;
            });
        }
    });
    return returnValue;
}

var someGuid = trackPage();

最佳答案

所以,这个问题已经被问过一百万次了,我确信每个人(包括我自己)tried this once .

这只是异步调用的本质,您不能将其结果用作返回值。这就是为什么他们让你传入一个获取调用结果的函数,他们也无法返回它!另请注意,elqTracker.pageTrack() 函数调用会立即返回,因此您的 returnValue 只是未定义

大多数人(参见 dfsq 的回答)通过引入回调函数作为参数来解决这个问题。这个方法已经被尝试过,并且是正确的——但是 jQuery 有 $.Deferred 。这允许您让自己的异步逻辑返回一个 promise,然后您可以将任意数量的回调附加到该 promise :

function trackPage(){
    var elqTracker = new jQuery.elq( 459 ),
        dfd = $.Deferred();

    elqTracker.pageTrack({
        success: function() {
            elqTracker.getGUID(function( guid ) {
                dfd.resolve( guid );
            });
        }
    });

    return dfd.promise();
}

// example use:
trackPage().done(function( guid ) {
    alert( "Got GUID:" + guid );
});

现在请注意,您的 trackPage() 返回一个可以附加回调的对象?您也不必立即附加它们。

var pageHit = trackPage().done(function( guid ) {
    alert( "Page Hit GUID:" +guid );
});

$("button").click(function() {
    pageHit.done( function( guid ) {
        alert( "Clicked on Page GUID:" + guid );
    });
});

此外,jQuery AJAX 模块也总是返回 Promise,因此如果您制定自己的逻辑返回 Promise,那么所有 AJAX 内容的界面应该非常相似。

<小时/>

作为旁注:我想指出您的 var returnValue 无论如何都处于错误的“范围”中。它需要在 trackPage 函数的外部作用域中声明。即使进行了此修复,这个概念仍然不起作用。

关于JavaScript 与 jQuery 异步返回值/赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7779697/

相关文章:

javascript - 选择复选框后变量未更新

javascript - 从 mongodb 中的子文档数组中提取(除一个之外的所有)文档

javascript - Angular 4 - 如何从指令中运行动画?

python - 异步任务队列和异步IO

javascript - 在express应用程序中异步执行res.render

javascript - 如何将订阅放入 RxJS 或 Angular2 中 Observables 的过滤器中?

javascript - 不使用自定义标签属性(例如 <a my_att ='...' >)的一些充分理由是什么

jquery - CSS 过渡导致滞后

jQuery 选择器喜怒无常

javascript - 实时聊天重新加载对象以设置新组