我有以下 jQuery 函数。我试图返回 alert();
中显示的 GUID 值警报工作正常并且值已填充,但是我似乎无法将其分配给变量并返回其值。
最终我需要访问其他函数中的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();
最佳答案
所以,这个问题已经被问过一百万次了,我确信每个人(包括我自己)tried this once .
这只是异步调用的本质,您不能将其结果用作返回
值。这就是为什么他们让你传入一个获取调用结果的函数,他们也无法返回
它!另请注意,elqTracker.pageTrack()
函数调用会立即返回,因此您的 returnValue
只是未定义
。
大多数人(参见 dfsq 的回答)通过引入回调函数作为参数来解决这个问题。这个方法已经被尝试过,并且是正确的——但是 jQuery 有 $.Deferred
。这允许您让自己的异步逻辑返回一个 promise
,然后您可以将任意数量的回调附加到该 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
函数的外部作用域中声明。即使进行了此修复,这个概念仍然不起作用。
关于JavaScript 与 jQuery 异步返回值/赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7779697/