JavaScript异步返回值/赋值jQuery

这个问题在这里已经有了答案:

  • 如何返回来自异步调用的响应? 33个答案

  • 所以,这个问题已经被提出了一百万次,我确信每个人(包括我自己)都曾尝试过这一次。

    这只是异步调用的本质,您不能将它们的结果用作return值。 这就是为什么他们让你传递一个函数来获得调用的结果,他们也不能return它! 另请注意, elqTracker.pageTrack()函数调用返回IMMEDIATELY,因此您的returnValue是简单的undefined

    大多数人(参见dfsq的答案)通过引入一个回调函数作为参数来解决这个问题。 这个方法已经尝试过了,真的 - 不过jQuery的$.Deferred 。 这允许您使自己的异步逻辑返回一个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函数的外部范围中声明。 即使有了这个修复,这个概念仍然不起作用。


    既然你有异步调用你正在尝试编写代码的方式是行不通的(因为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
    });
    
    链接地址: http://www.djcxy.com/p/9485.html

    上一篇: JavaScript asynchronous return value / assignment with jQuery

    下一篇: JavaScript function that returns AJAX call data