2011-07-13 158 views
5

所以我在这里有这个JS代码,我试图从成功和错误回调中设置obj,但显然toLinkInfo函数范围不是这些的父范围?无论如何,我总是从这个函数中返回null。我尝试了一堆东西,但不能得到它的工作,我想我太习惯了C &朋友:)我怎样才能得到这个工作?在JavaScript中访问外部范围

LinkInfoGrabber.prototype.toLinkInfo = function() { 
    var obj = null; 
    $.ajax({ 
     url: this.getRequestUrl(), 
     success: function(raw) { 
      obj = new LinkInfo(raw); 
     }, 
     error: function(jqXHR, textStatus, errorThrown) { 
      obj = new LinkInfoException(jqXHR, textStatus, errorThrown); 
     }, 
     dataType: 'html' 
    }); 

    if (obj instanceof LinkInfo) { 
     return obj; 
    } else { 
     throw obj; 
    } 
} 
+0

也许病情未得到满足 – Ibu

+0

我已经看过这个问题几次了。 – ChaosPandion

+0

我的思维上限目前无法正常工作。你可以添加LinkInfo构造函数吗? – fncomp

回答

3

这是因为AJAX调用是异步的 - 它们发生在与上下文其余部分不同的时间。

试着给它一个回调函数(下面称为回调函数)。

LinkInfoGrabber.prototype.toLinkInfo = function(callback) { 
    $.ajax({ 
     url: this.getRequestUrl(), 
     success: function(raw) { 
      callback(new LinkInfo(raw)); 
     }, 
     error: function(jqXHR, textStatus, errorThrown) { 
      obj = new LinkInfoException(jqXHR, textStatus, errorThrown); 
     }, 
     dataType: 'html' 
    }); 
} 

var l = new LinkInfoGrabber() 
l.toLinkInfo(console.log) //replace console.log with something meaningful 

虽然这种方法不能提供完全一样的结果能够内嵌调用一切,它允许网络的异步性的好处。

+0

我真的很好笑,竟然忘记了那个**异步** JavaScript和XML是异步的。我最终将该函数之外的$ .ajax调用移到了该函数之外,而且效果很好。谢谢。 –

0

你调用ajax返回前返回obj,所以返回时,它不设置任何东西,但空。

3

此代码:

if (obj instanceof LinkInfo) { 
     return obj; 
    } else { 
     throw obj; 
    } 

运行后立即启动Ajax调用,但obj不是设置直到Ajax调用成功完成。这是一个常见的误解。 Ajax调用是异步的。您对$ .ajax()的调用启动异步调用,然后您的函数的其余部分立即执行。成功处理程序仅在ajax调用成功(稍后一段时间)时才会调用。你不能从你的函数返回obj。你必须在成功处理程序中处理obj,然后再调用任何想从成功处理程序中使用它的任何东西。