JavaScript异步返回值/赋值jQuery
这个问题在这里已经有了答案:
所以,这个问题已经被提出了一百万次,我确信每个人(包括我自己)都曾尝试过这一次。
这只是异步调用的本质,您不能将它们的结果用作return
值。 这就是为什么他们让你传递一个函数来获得调用的结果,他们也不能return
它! 另请注意, elqTracker.pageTrack()
函数调用返回IMMEDIATELY,因此您的returnValue
是简单的undefined
。
大多数人(参见dfsq的答案)通过引入一个回调函数作为参数来解决这个问题。 这个方法已经尝试过了,真的 - 不过jQuery的$.Deferred
。 这允许您使自己的异步逻辑返回一个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
函数的外部范围中声明。 即使有了这个修复,这个概念仍然不起作用。
既然你有异步调用你正在尝试编写代码的方式是行不通的(因为return returnValue;
在trackCode返回值尚未定义)的时刻。 相反,你应该将回调传递给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
});
链接地址: http://www.djcxy.com/p/9485.html
上一篇: JavaScript asynchronous return value / assignment with jQuery