javascript - 如何仅在可用时使用提供商发送的数据?

标签 javascript angular ionic-framework ionic2 ionic3

我有一个从 JSON 读取数据的提供程序,我希望它将数据发送到页面。 为了确保数据很好地发送到用户界面,我有一个 console.log 应该显示数组的第一个元素,但问题是我不知道如何仅在信息出现后调用此 console.log已被提供者检索并传递。 当然,目的不是console.log,而是在数据由提供者传递后对其进行实际操作。

提供者:

getWorldCities(){
    if (this.worldCities) {
  // already loaded data
  return Promise.resolve(this.worldCities);
}
    this.http.get('../assets/city.list.json')
      .map(res => res.json()).subscribe(data => {
        console.log(data.status);
        console.log(data);
        console.log(data.headers);
        this.worldCities = data;
        return Promise.resolve(this.worldCities);
      },
      err => console.log(err),
      () => console.log('yay')
    )
  }

}

在我的页面中:

  ionViewDidLoad() {
    console.log('ionViewDidLoad ChooseCity');
    console.log(this.worldCities);
    this.AppCitiesProvider.getWorldCities().then(data => {
      this.worldCities = data;
      console.log(this.worldCities[0]);
    });
  }

我得到的错误是:

Cannot read property 'then' of undefined

我应该如何正确地做到这一点?

最佳答案

在收到数据后检索数据并执行操作的“最佳实践”是使用 Observable 而不是 Promise。像这样的事情:

在服务中:

getMovies(): Observable<IMovie[]> {
    return this.http.get<IMovie[]>(this.moviesUrl)
        .do(data => console.log(JSON.stringify(data)))
        .catch(this.handleError);
}

handleError(error) {
  // Your error handling here.
  console.error(error);
}

在组件中:

ngOnInit(): void {
    this.movieService.getMovies()
        .subscribe(
            (movies: IMovie[]) => { 
                this.movies = movies;
                this.filteredMovies = this.performFilter(this.listFilter);
            },
            (error: any) => this.errorMessage = <any>error);
}

订阅的第一个回调函数中的任何代码只会在检索数据后执行。

请参阅此了解更多信息(和图片!)Subscribe to observable is returning undefined

关于javascript - 如何仅在可用时使用提供商发送的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46819651/

相关文章:

javascript - 使用 listgroup.js 时获取选定的值

javascript - 慢弹跳Javascript

javascript - 如何在 React JS 中修改 Material UI prop-function 的默认值?

javascript - Concat Angular 2 条路线

angular - 属性值绑定(bind) : square brackets vs curly brackets

cordova - Android 无法构建 - 找不到 com.android.tools :common:25. 5.0-alpha-preview-02

php - 如何每十秒刷新一次 php 脚本?

javascript - 从 Object.freeze 获取随机对象

ios - 在ios中使用cordova-file-transfer插件上传多部分表单数据图像失败

javascript - 如何从 mac 中完全删除 Ionic 和 Cordova 安装?