JavaScript 异步返回值/jQuery 赋值

IT技术 javascript jquery asynchronous
2021-01-21 22:57:06

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

最终我需要访问其他函数中的 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();
2个回答

所以,这个问题已经被问了一百万次了,我相信每个人(包括我自己)都试过一次

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

大多数人(参见 dfsq 的回答)通过引入回调函数作为参数来解决这个问题。这种方法已经尝试过,并且是正确的——但是 jQuery 有$.Deferred. 这允许您让自己的异步逻辑返回 a 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 module也总是返回Promise,因此如果您制作自己的逻辑返回Promise,所有 AJAX 内容的界面应该非常相似。


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

由于您有异步调用,因此您尝试编写代码的方式将不起作用(因为此时return returnValue;trackCode 返回值尚未定义)。相反,您应该将回调传递给 trackPage:

function trackPage(callback) {
    var elqTracker = new jQuery.elq(459);
    elqTracker.pageTrack({
        success: function() {
            elqTracker.getGUID(function(guid) {
                alert(guid);
                // Instead of this: var returnValue = guid;
                // You should use your callback function
                callback(guid);
            });
        }
    });
    return returnValue;
}

trackCode(function(guid) {
    // perform some actions with guid
});