2016-03-14 6 views
2

Я строю приложение, чтобы получить некоторые события из Facebook, посмотрите:Угловое 2 Наблюдаемые

EventComponent:

events: Object[] = []; 

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

Организация мероприятий:

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) Ответ от запроса на отправку не вернет массив объектов по умолчанию, мне придется сделать некоторые манипуляции. Должен ли я делать что-то подобное?

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; 
    }) 

ответ

0

Вот ответы на вопросы:

1) Вы можете использовать в 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 позволяет вам вернуть то, что вы хотите ...

+0

По какой-то причине я не мог заставить 'fromPromise' работать. Поэтому для упрощения я попытался подписаться только на 'accessToken', но не работал. Я помещаю это внутри моего конструктора компонентов: 'Observable.fromPromise (this.authenticationService.getAccessToken()). Subscribe (response => this.response = response, error => this.response = error);'. Я также обновил свой ответ методом 'getAccessToken()'. –

+0

Я видел, что вы используете плагин facebook. Ваша проблема связана с обнаружением изменений. Я имею в виду, что данные не обновляются в вашем представлении ... Является ли flatMap сразу после вызова fromPromise? –

+0

Да, у меня есть приложение [Ionic 2] (http://ionicframework.com/docs/v2/), использующее [cordova-plugin-facebook4] (https://github.com/jeduan/cordova-plugin-facebook4) , Поскольку я не мог заставить ваш код работать, я сначала пытаюсь получить «accessToken» на основе вашего ответа с помощью наблюдаемых и показать его на мой взгляд, после того, как мне это удастся, я перейду к сообщению. Я не использую flatMap() здесь. Когда я пытаюсь получить доступ к странице, она не загружается. Я создал [jsfiddle] (https://jsfiddle.net/t91encqt/4/) с соответствующей частью кода, возможно, это поможет вам понять мою проблему. –

0
  1. Поместите событие внутри блока тайм-аута и задать интервал 60-х годов. setTimeout(() => {},60000).
  2. Использование строки шаблона полностью прекрасное, но вы говорите, что его ценность исходит из обещания. Если весь ваш блок кода находится внутри функции решения обещания, это должно быть хорошо. Так что это зависит от того, где находится ваш код. И почему обещает. В A2 рекомендуется использовать Observables, а не обещания. Не смешивайте их.
  3. Вы ничего не возвращаете в функции ошибки. Поэтому, если вы вернете ошибку из этого блока, вы получите данные об ошибках в случае ошибки. error => error или error => { return error; }.
  4. Точно вам следует сопоставить, чтобы получить ответ и обработать его и вернуть только массив из этой функции. .map(resp => { return resp.array}). Поскольку в формате JSON теперь действует, вам нужно получить массив и вернуть его. вы можете сделать столько изменений, сколько хотите, прежде чем возвращать его.

Вы можете редактировать ответ ...