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 });