小编典典

JavaScript异步返回值/使用jQuery赋值

javascript

我有以下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();

阅读 355

收藏
2020-04-25

共1个答案

小编典典

这只是异步调用的性质,您不能将其结果用作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模块也总是返回promise,因此,如果您自己编写逻辑返回promise,则所有AJAX东西的接口都应该非常相似。


附带说明:我想指出您varreturnValue仍然处于错误的“范围”内。需要在trackPage函数的外部范围中声明它。即使有了此修复程序,该概念仍然不起作用。

2020-04-25