2017-04-04 48 views
0

爲什麼會收到以下錯誤:的ReferenceError:結果沒有定義」JavaScript中的ReferenceError消息?

function returnData() {   
    _myService.getData().then(function(data) { 
    var result = data; 
    }); 
    return result; 
} 
+0

可能重複[如何從異步調用返回響應?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-打電話) – nvioli

+0

@nvioli:這當然是非常密切相關的,但OP詢問的實際錯誤是範圍問題。但是,**非常密切相關。 –

回答

2

因爲result聲明中你傳入then回調它不存在外界

您可以在外面聲明,但請注意,它不會像以後的return result;行一樣擁有數據:

function returnData(){ 
    var result;   // <==== Note 

    _myService.getData().then(function(data){ 

     result = data;  // <==== No `var` here 
    }) 

    // WON'T HAVE THE VALUE HERE, it's too soon 
    return result; 
} 

請參閱How do I return the response from an asynchronous call?爲什麼,以及如何處理它。基本上,你根本不需要returnData函數,它不會增加任何值(除了可能封裝在_myService周圍)。它不能return的值。因此,無論使用_myService直接,或者如果你想隱瞞,只是

function returnData() { 
    return _myService.getData(); 
} 

...和使用then調用代碼來接受它。由於再次,returnData不能return的數據。

0

我想,叫_myService.getData()你正在對Web服務的異步調用..

在這種情況下,你可以回到你這樣的服務響應數據:

function returnData() { 
    return _myService 
    .getData() 
    .then(function(data) { 
     // Here you can work with the response data 
     return data; 
    }); 
} 

注意,你可以工作在回調中使用response,正如您正確傳入then

+0

爲什麼?有什麼不同?爲什麼這有關係?一個好的答案應該解釋*事情。另外:那個'then'處理程序的目的是零。它應該只是'function returnData(){return _myService.getData(); }「如果它會存在的話(就像我在我的回答中所說的那樣)。 –

+0

兩件事:1.您在我的評論後更改了代碼。你的[原始代碼](http://stackoverflow.com/revisions/43212031/1)有'.then(函數(數據){返回數據;})'這是我指的完全沒有意義的事情。 2.從問題中我們可以看出,新代碼是錯誤的。在問題中沒有跡象表明回調接收的值具有「數據」屬性,或者OP希望取代整個值。這不是更好或更清潔。有時我們可能需要這樣的轉換,但我們沒有理由認爲我們在這裏做。 –

+0

基於我的假設,調用'_myService。getData()'正在對Web服務進行異步調用。 –

0

@ Yosvel的答案是正確的,原因是因爲您正在向您的服務進行異步調用。

這樣做,你必須等待結果返回給你,然後可以在你的然後函數中處理。

通過進行兩次返回調用,您的返回值未定義,因爲它沒有等待回調函數,而只是返回空值。