Javascript 如何让代码按时返回结果
我有这个功能,我试图从一个特定的终点,使用角度来获取最喜欢的电影。从类方法内部获取所有电影列表后,当我尝试使用该列表时,我发现该列表不可用 这就是我尝试过的Javascript 如何让代码按时返回结果,javascript,angular,rxjs,observable,Javascript,Angular,Rxjs,Observable,我有这个功能,我试图从一个特定的终点,使用角度来获取最喜欢的电影。从类方法内部获取所有电影列表后,当我尝试使用该列表时,我发现该列表不可用 这就是我尝试过的 import { Injectable } from '@angular/core'; import {HttpClient} from '@angular/common/http' import {Observable} from 'rxjs' import { map, tap } from 'rxjs/
import { Injectable } from '@angular/core';
import {HttpClient} from '@angular/common/http'
import {Observable} from 'rxjs'
import { map, tap } from 'rxjs/operators';
import { IMovie } from './welcome/welcome-page/movies-model';
@Injectable({
providedIn: 'root'
})
export class FavoriteMoviesService {
movieList: IMovie[];
constructor(private _http: HttpClient) {
}
getFavMovies(id: number) {
let getMovies = () => {
return this._http.get('../assets/movies.json').pipe(
tap(response => console.log(response))
).subscribe(response => response = this.movieList)
}
getMovies();
let chosenMovie = this.movieList? this.movieList.find(movie => movie.id == id): Array(null)
console.log(chosenMovie)
}
}
我真的不理解程序的流程,我以为调用函数getMovies()时设置了movieList属性,但局部变量chosenMovie没有得到所需的值。
请对此行为进行任何解释?将
this.moviesList
值分配给http调用后获得的响应
,这样做是错误的:响应=this.movieList
:
let getMovies = () => {
return this._http.get('../assets/movies.json').pipe(
tap(response => console.log(response))
).subscribe(response => this.moviesList = response.data; // whatever is your object for movielist)
}
由于movieList
是空的,因此它将返回空响应,因此没有结果
您应该在subscribe块中返回
响应。在使用moviesList之前,您应该等待响应。按如下所示修改函数,以便在收到响应后进行处理
getFavMovies(id: number) {
this._http.get('../assets/movies.json').pipe(
tap(response => console.log(response))
).subscribe(response => {
this.movieList = response;
let chosenMovie = this.movieList? this.movieList.find(movie => movie.id == id): Array(null);
console.log(chosenMovie)
})
}
您的getMovies
函数是异步的,而您的chosenMovie
会同步执行,而无需等待getMovies
完成。因此,您将获得chosenMovie
emptyYou正在丢弃响应,请将.subscribe(response=>response=this.movieList)
更改为。subscribe(response=>this.movieList=response)
我确实返回了响应,但是如何获取值以便使用它呢?当我返回响应并将函数分配给变量并在控制台上注销该值时,我得到了一个奇怪的对象,它与我期望的数据完全不同。这就是我得到的:Subscriber{closed:false,_parent:null,_parents:null,_subscribes:Array(1),syncErrorValue:null,}您可以检查响应值,从中获取所需的对象,并将其分配给This.moviesList
,这意味着我必须在subscribe主体上编写一大堆代码