2017-03-27 71 views
1

我希望我沒有犯任何菜鳥錯誤,但我似乎無法確定這一點。 因此,這裏的代碼:無法將訂閱的結果分配給參考陣列

這是一個分量

search(term: string,service,refArray: any[]){ 
    service.search(term) 
    .subscribe(
     result => { 
     refArray = result; 
     console.log(refArray); // display result as it should 
     console.log(this.resultArray); // display "undefined" 
     }, 
     err => { 
     refArray = []; 
     console.log(err); 
     }, 
    () => {console.log('completed')} 
    ); 
} 

然後,我用它像這裏面的函數:

this.search(
    searchTerm, 
    this.Service, 
    this.resultArray, 
); 

的問題是,我的組件級別聲明的變量「即使函數的「refArray」參數正常獲取,「apiSpots」也不會從訂閱中獲得結果。 我懷疑訂閱內部的「refArray」與我傳遞給函數的內容不完全相同,但我不知道如何解決它。

任何想法?

編輯:錯字

SOLUTION:

所以,THX馬丁,這裏的修改樣本: 搜索功能

search(term: string,service,callback: (result) => void){ 
service.search(term) 
    .subscribe(
    result => { 
     callback(result); 
    }, 
    err => { 
     callback([]); 
     console.log(err); 
    }, 
    () => {console.log('completed')} 
); 
} 

和使用

let context = this; 
this.search(
    searchTerm, 
    this.Service, 
    function(result){ 
     context.resultArray = result; 
    }, 
); 

回答

3

如果我正確理解您的問題,您希望將結果從service.search(term)分配給作爲參考傳遞的refArray數組。

如果你只使用此:

refArray = result 

然後你重寫本地變量refArrayresult但這對基準沒有任何影響(原始數組)。您剛剛重新分配了名爲refArray的本地變量。

但是,您可以使用任何方法就地修改陣列。例如,在循環中調用refArray.push()以追加result陣列中的所有項目。儘管如此,這不是使用Rx的最佳方式。

而是返回可觀察:

search(term: string,service,refrray: any[]){ 
    return service.search(term); 
} 

然後訂閱它,當你需要它:

this.myService.search(...).subscribe(result => this.resultArray = result); 

或者,如果你真的需要使用它,你正在使用它的權利的方式現在不要通過refArray,而是使用回調函數將結果賦給本地範圍的this.resultArray。然後在撥打search()方法時,您只需撥打subscribe()呼叫的回叫。

+0

我現在明白了,謝謝。 –

0

你已經把從服務的結果值到refArray,所以它是正常它顯示的值,但resultArray是未定義的,因爲你沒有通過它作爲未定義。調用函數之前發生錯誤。

+0

我不明白,你的意思是在「subscribe()」方法中的「refArray」和我傳遞給函數的「refArray」是不一樣的? –

+0

那個傢伙正在回答正確 –