Angular 2 Observables

时间:2016-03-14 01:16:19

标签: javascript http promise angular observable

我正在构建一个应用程序来从Facebook获取一些活动,看看:

EventComponent:

events: Object[] = [];

constructor(private eventService: EventService) {
  this.eventService.getAll()
    .subscribe(events => this.events = events)
}

EventService:

getAll() {
  const accessToken = 'xxxxxxxxxxx';
  const batch = [{...},{...},{...},...];
  const body = `access_token=${accessToken}&batch=${JSON.stringify(batch)}`;

  return this.http.post('https://graph.facebook.com', body)
    .retry(3)
    .map(response => response.json())
}

的AuthenticationService:

getAccessToken() {
    return new Promise((resolve: (response: any) => void, reject: (error: any) => void) => {
      facebookConnectPlugin.getAccessToken(
        token => resolve(token),
        error => reject(error)
      );
    });
  }

我有几个问题:

1)如何设置每隔60秒更新一次事件的间隔?

2)accessToken的价值实际上来自一个承诺,我应该这样做吗?

getAll() {
  const batch = [{...},{...},{...},...];
  this.authenticationService.getAccessToken().then(
    accessToken => {
      const body = `access_token=${accessToken}&batch=${JSON.stringify(batch)}`;
      return this.http.post('https://graph.facebook.com', body)
        .retry(3)
        .map(response => response.json())
    },
    error => {}
  );
}

3)如果是,我怎么能处理来自getAccessToken()承诺的错误,因为我只返回观察者?

4)来自post请求的响应默认情况下不会返回一个对象数组,我将不得不进行一些操作。我应该这样做吗?

return this.http.post('https://graph.facebook.com', body)
  .retry(3)
  .map(response => response.json())
  .map(response => {
    const events: Object[] = [];
    // Manipulate response and push to events...
    return events;
  })

2 个答案:

答案 0 :(得分:0)

  1. 将事件置于超时块内并将间隔设置为60秒。 5f=0.00000
  2. 使用模板字符串是完全正常的,但你告诉它的价值来自一个承诺。如果你的整个代码块都在内部解决了promise的功能,那应该没问题。所以这取决于你的代码在哪里。为什么要承诺。在A2中,建议使用Observables而不是承诺。不要混合它们。
  3. 您没有在错误功能中返回任何内容。因此,如果您从该块返回错误,您将在出现错误时获得错误数据。 setTimeout(() => {},60000)error => error
  4. 您应该映射以获取响应并对其进行操作并仅从该函数返回数组。 error => { return error; }。由于Respons现在是JSON格式,你必须从中获取数组并返回它。在返回之前,您可以进行所需的修改。
  5. 随意编辑答案......

答案 1 :(得分:0)

以下是您的问题的答案:

1)您可以利用observables的interval函数:

getAll() {
  const accessToken = 'xxxxxxxxxxx';
  const batch = [{...},{...},{...},...];
  const body = `access_token=${accessToken}&batch=${JSON.stringify(batch)}`;

  return Observable.interval(60000).flatMap(() => {
    return this.http.post('https://graph.facebook.com', body)
                    .retry(3)
                    .map(response => response.json());
  });
}

2)您可以在此级别利用可观察量的fromPromise函数:

getAll() {
  const batch = [{...},{...},{...},...];
  return Observable.fromPromise(this.authenticationService.getAccessToken())
                   .flatMap(accessToken => {
    const body = `access_token=${accessToken}&batch=${JSON.stringify(batch)}`;
    return this.http.post('https://graph.facebook.com', body)
                    .retry(3)
                    .map(response => response.json())
    });
}

3)您可以利用catch运算符来处理错误:

getAll() {
  const batch = [{...},{...},{...},...];
  return Observable.fromPromise(this.authenticationService.getAccessToken())
                   .catch(() => Observable.of({})) // <-----
                   .flatMap(accessToken => {
    const body = `access_token=${accessToken}&batch=${JSON.stringify(batch)}`;
    return this.http.post('https://graph.facebook.com', body)
                    .retry(3)
                    .map(response => response.json())
    });
}

在这种情况下,当获取访问令牌发生错误时,会提供一个空对象来构建POST请求。

4)是的,确定! map运算符允许您返回所需内容...