Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何让代码按时返回结果_Javascript_Angular_Rxjs_Observable - Fatal编程技术网

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主体上编写一大堆代码