Хобрук: Ваш путь к мастерству в программировании

Несколько запросов $ http в Ionic2 с интервалом

Я хочу разделить несколько HTTP-запросов на один наблюдаемый, вызвать его по интервалам и поделиться одними и теми же данными между всеми подписчиками.

Мой код пока выглядит так:

import {Observable} from "rxjs/Rx";

let obs = Observable
    .interval(10000)
    .publish()
    .connect()
    .forkJoin(
      this.http.get(API_URL + "x", {headers: this.headers})
        .map(response => response.json()),
      this.http.get(API_URL + "y", {headers: this.headers})
        .map(response => response.json())
    )
    .map(res => {
     // do some stuff
     return res;
    });

Ошибка:

Typescript Error
Property 'forkJoin' does not exist on type 'Subscription'.

Я прочел:

https://blog.oughttram.io/angular/2016/06/16/cold-vs-hot-observables.html

https://stackoverflow.com/questions/38842832/multiple-http-requests-in-ionic2

http://restlet.com/blog/2016/04/12/intecting-efficiently-with-a-restful-service-with-angular2-and-rxjs-part-2/

Спасибо!


  • пробовали без publish() и connect()? 25.01.2017
  • Результат к этой ошибке: Свойство forkJoin не существует для типа Observable ‹number›. 25.01.2017
  • по крайней мере, у вас есть Observable вместо подписки. Возможно, вы найдете ответ в свойстве stackoverflow.com/questions/38443798/ 25.01.2017
  • Я перепробовал все подсказки, приведенные в этой ссылке, но ничего не помогло. Я пробовал обновиться до rxjs 5.0.3, но результат тот же. Возврат к 5.0.0-beta.12 25.01.2017
  • forkJoin - это статический наблюдаемый метод ... Вы должны вызывать его с Rx.Observable.forkJoin(...) 25.01.2017

Ответы:


1

Примерно так должно работать:

let source = Observable
    .interval(1000)
    .flatMap(() => {
        return Rx.Observable.forkJoin(
            this.http.get(API_URL + "x", {headers: this.headers})
                .map(response => response.json()),
            this.http.get(API_URL + "y", {headers: this.headers})
                .map(response => response.json())
        )
    })
    .publish();

source.connect();

Затем наблюдатели подписываются на эту наблюдаемую

source.subscribe(...);

Я здесь беру наблюдаемый интервал и заменяю каждое значение на forkJoin всех операций. Затем публикуйте его, чтобы предоставить одни и те же данные для многих подписок.

Еще одна проблема, с которой вы столкнулись в своей реализации, заключается в том, что вы возвращали подписку от .connect(), что просто означало избавиться от нее (отказаться от подписки), когда она вам понадобится. Наблюдатели должны подписаться на опубликованный источник.

25.01.2017
  • Спасибо! Это работает! В моем случае мне пришлось заменить Rx.Observable.forkJoin на Observable.forkJoin. Спасибо за отличное объяснение;) 25.01.2017
  • Новые материалы

    Понимание дженериков в TypeScript: подробное руководство
    Введение TypeScript, строго типизированный надмножество JavaScript, хорошо известен своей способностью улучшать масштабируемость, удобочитаемость и ремонтопригодность приложений. Одной из..

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..