2011-07-13 145 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,然後再調用任何想從成功處理程序中使用它的任何東西。