所以,这个问题已经被问了一百万次了,我相信每个人(包括我自己)都试过一次。
这只是异步调用的性质,您不能将它们的结果用作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 module也总是返回Promise,因此如果您制作自己的逻辑返回Promise,所有 AJAX 内容的界面应该非常相似。
作为旁注:我想指出您var returnValue
无论如何都在错误的“范围”中。它需要在trackPage
函数的外部范围内声明。即使有了这个修复,这个概念仍然不起作用。