【问题标题】:Ionic 2: storing the response from an http GET requestIonic 2:存储来自 http GET 请求的响应
【发布时间】:2017-03-25 23:47:59
【问题描述】:

我正在开发一个应用程序并设置了一个事件提供程序。我正在使用 Eventbrite API 来获取一个城市中发生的事件池。我在试图弄清楚如何执行获取请求并将其存储在变量中时遇到了困难。这是请求的 URL:

https://www.eventbriteapi.com/v3/events/search/?location.address=Atlanta&expand=organizer,venue&token={MY_TOKEN}

到目前为止,这是我的提供者:

import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import {NativeStorage} from "ionic-native";
import 'rxjs/add/operator/map';

/*
  Generated class for the EventProvider provider.

  See https://angular.io/docs/ts/latest/guide/dependency-injection.html
  for more info on providers and Angular 2 DI.
*/
@Injectable()
export class EventProvider {
  data:any;
  constructor(public http: Http) {
    this.data = null;
    //console.log('Hello EventProvider Provider');
  }

  public getCityEvents(city) {
    var event = {id: "", name: "", start: "", end: "", latitude: "", longitude: "", venue:""};
    NativeStorage.getItem('event')
      .then(function (data) {
        alert("data: " + JSON.stringify(data));
        alert("data id: " + data.id);

        event = {
          id = data.id,
          name = data.name,
          start = data.start,
          end = data.end,
          latitude = data.latitude,
          longitude = data.longitude,
          venue = data.venue
        };


      this.http.get("https://www.eventbriteapi.com/v3/events/search/?location.address=Atlanta&expand=organizer,venue&token=VMGQGYQUIO3IKNS75BD4").subscribe( data =>{
        console.log(data);
        },
      error => {
        console.log(error)
      });
      })
  }

}

我现在只想将此 get 请求的 JSON 响应存储在一个变量中。有人可以提供一些帮助吗?

【问题讨论】:

  • this.data = event 应该这样做...但是您需要使用箭头函数(params) => expression or block,而不是function 表达式。如果您没有可用的转译器,请将其别名为闭包外部的临时变量并在闭包内引用它。 this 引用在 function 内动态限定
  • 对不起,我不太明白。在浏览器中输入 url 时,我得到了我想要的响应,但我不确定我所拥有的是否真的有效。我定义的事件变量包含我想从 JSON 中取出的最终数据字段,但 JSON 响应也有许多其他字段。您能否根据我发布的代码详细说明您的解决方案?
  • 试试 ajai Jothi 的回答或我的评论中的方法

标签: angularjs ionic-framework get ionic2 eventbrite


【解决方案1】:

NativeStorage.getItem('event').then((data) => { ... } 中使用箭头函数,您可以在http 回调中访问实际上下文this

import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import {NativeStorage} from "ionic-native";
import 'rxjs/add/operator/map';

/*
  Generated class for the EventProvider provider.

  See https://angular.io/docs/ts/latest/guide/dependency-injection.html
  for more info on providers and Angular 2 DI.
*/
@Injectable()
export class EventProvider {
  data:any;
  constructor(public http: Http) {
    this.data = null;
    //console.log('Hello EventProvider Provider');
  }

  public getCityEvents(city) {
    var event = {id: "", name: "", start: "", end: "", latitude: "", longitude: "", venue:""};
    NativeStorage.getItem('event')
      .then((data) => {
        alert("data: " + JSON.stringify(data));
        alert("data id: " + data.id);

        event = {
          id = data.id,
          name = data.name,
          start = data.start,
          end = data.end,
          latitude = data.latitude,
          longitude = data.longitude,
          venue = data.venue
        };


      this.http.get("https://www.eventbriteapi.com/v3/events/search/?location.address=Atlanta&expand=organizer,venue&token=VMGQGYQUIO3IKNS75BD4").subscribe( data =>{
        console.log(data);
        //variable assignment
        this.data = data;
      },
      error => {
        console.log(error)
      });
      })
  }

【讨论】:

    【解决方案2】:

    创建函数

      getData() {
    return this.http.get("https://www.eventbriteapi.com/v3/events/search/?location.address=Atlanta&expand=organizer,venue&token=VMGQGYQUIO3IKNS75BD4")
                        .map(this.extractData)
                        .catch(this.handleError);
      }
    
    
      private extractData(res: Response) {
    let body = res.json();
    return body.data || { };
      }
    

    然后订阅

      this.getData()
                         .subscribe(
                           data => console.log(data);
                           error =>  console.log(error));
      }
    

    请参考angular docs你从邮递员那里得到的作品。

    【讨论】:

    • 这完全是错误的,通过传递未绑定的方法,您并不能解决 OP 中与this 上的词法闭包特别相关的问题。相反,您将错误传播到建议的模式中。无论如何,传递这样的方法也是一种绝对糟糕的编码实践。在错误的时候模仿有角度的文档是没有意义的
    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多