[英]unable to assign data from response data in Angular
我有一個函數,應在調用時返回對象數組。 該功能看起來像這樣
loadTodo(): Todo[]{
var data
this.http.get(`${this.API_URL}todos`).toPromise().then(res => {
data = res.json()
}, error => {
console.log(error)
})
return data}
這會導致意外的行為,其中在成功響應塊內正確分配了data
變量,但在響應塊外訪問時undefined
。
該函數被分配給類型為Todo[]
的變量,並在聲明該變量時立即調用。 我對TypeScript和Angular很陌生,但對JavaScript卻不是。 我是否在函數范圍/關閉方面缺少某些內容,或者此問題與TypeScript / Angular有關?
全班看起來像這樣:
export class TodoDataService {
API_URL: String = 'http://localhost:3000/'
todos: Todo[] = this.loadTodo();
constructor(private http: Http) {
}
loadTodo(): Todo[]{
this.http.get(`${this.API_URL}todos`).toPromise().then(res => {
this.parcedTodos = res.json()
console.log('inside function')
console.log(this.parcedTodos)
}, error => {
console.log(error)
})
console.log('outside function')
console.log(this.parcedTodos)
return this.parcedTodos
}
}
這是因為http
調用是asynchronous
。
您需要確保僅在通話完成后才訪問數據。
export class TodoDataService {
API_URL: String = 'http://localhost:3000/'
todos: Todo[] = this.loadTodo();
constructor(private http: Http) {
}
loadTodo(): Todo[]{
this.http.get(`${this.API_URL}todos`).toPromise().then(res => {
this.parcedTodos = res.json()
console.log('inside function')
console.log(this.parcedTodos)
}, error => {
console.log(error)
},
{
console.log(this.parcedTodos);
// This is where your call gets completed. Here you can access assigned data or call another function where you can access data.
})
console.log('outside function')
console.log(this.parcedTodos) // This is called before asynchronous call is completed. Thats why it is undefined yet.
return this.parcedTodos
}
}
希望這可以幫助。
我認為不是必須使用res.json()
因為有角度的管道已經可以工作了。 您是否嘗試直接分配給變量res?
就像其他朋友說的那樣,您在做某些事情上做得不好。
首先:您必須了解異步方法
第二:使用Observables導入rxjs / Observable; 並遵循其回調流程
例
export class TodoDataService {
API_URL: String = 'http://localhost:3000/'
todos: Todo[] = this.loadTodo();
constructor(private http: Http) {
}
loadTodo() : Observable<Todo[]>{
return this.http.get(`${this.API_URL}todos`);
}
}
其他類使用此方法
todoDataService.loadTodo().subscribe(
(response) => {
console.log("Future response", response);
}
);
http.get()
是異步的,這意味着當您嘗試在then
回調之外打印parcedTodos
,它將仍然是未定義的。
this.http.get(whatever)
是一個async
調用。 您的data
是undefined
因為您需要在實際初始化之前訪問它。 也就是說,您正在success
處理程序( then
的第一個參數)內部對其進行初始化,並且可能在初始化之前對其進行了訪問。
您需要做的就是確保success
或error
處理程序之后執行此操作。 使用Observable
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.