所以,这个问题已经被问过一百万次了,我相信每个人(包括我自己)尝试过一次 http://fixingthesejquery.com/#slide42.
这只是异步调用的本质,您不能将它们的结果用作return
价值。这就是为什么他们让你传入一个函数来获取调用结果,但他们不能return
它要么!另请注意,elqTracker.pageTrack()
函数调用立即返回,因此你的returnValue
简直就是undefined
.
大多数人(参见 dfsq 的回答)通过引入回调函数作为参数来解决这个问题。这个方法已经被尝试过,并且是正确的——但是 jQuery 有$.Deferred http://api.jquery.com/category/deferred-object/。这允许您使自己的异步逻辑返回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
功能。即使进行了此修复,这个概念仍然不起作用。