JavaScriptasynchronous返回值/赋值与jQuery

我有以下jQueryfunction。 我试图返回alert();显示的GUID值alert(); 警报工作正常,价值是填充,但我似乎无法将其分配给一个variables,并返回其值。

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

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

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

大多数人(见dfsq的答案)通过引入一个callback函数作为参数来解决这个问题。 这个方法被尝试了,真的 – 不过jQuery有$.Deferred 。 这允许您使自己的asynchronous逻辑返回一个promise ,然后您可以将任意数量的callback附加到:

 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()返回一个对象,你可以附加callback? 您不必立即附加它们。

 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,所以如果你自己做出逻辑返回的话,所有你的AJAX的东西的接口应该是非常相似的。


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

既然你有asynchronous调用你正在尝试写代码的方式是不会工作的(因为通过return returnValue;在trackCode返回值尚未定义)的时刻。 相反,你应该将callback传递给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 });