Заполнение данных с двух разных URL-адресов в коллекцию магистрали - PullRequest
1 голос
/ 08 мая 2020

У меня есть Marionette.LayoutView, который вызывает коллекцию магистрали, извлекает данные и отображает их на основе ответа. Теперь проблема, с которой я столкнулся, заключается в том, что эта коллекция должна получать данные с двух разных конечных точек, обе должны быть независимыми, а затем возвращать объединенный результат. Ниже мой код:

My Marionette.LayoutView

var View = Marionette.LayoutView.extend({

    template: _.template(some.html),

    regions: {
        div1: '[data-region="div1"]',
        div2: '[data-region="div2"]',
    },

    initialize: function () {
        this.collection = new MovieCollection();
    },

    onRender: function () {
        if (this.collection.length) {
            this.div1.show(new TopMoviesByLikesView({
                collection: this.collection,
                movieCount: 10,
            }));

            this.div2.show(new TopMovieByRatingsView({
                collection: this.collection,
                movieCount: 10,
            }));
        }
    },

});

module.exports = AsyncView.extend({
    ViewConstructor: View,
});

My Collection

module.exports = Backbone.Collection.extend({

    model: TopMovieModel,

    initialize: function (response) {
        let movieCollection = [];
            let movieSourceOne = new TopMovieFromSourceOne();
            movieSourceOne.fetch({
                success: function (collection, response) {
                    movieCollection = [...movieCollection, ...response.data];
                },
                error: function (collection, response, options) {
                    console.info('~ Response::ERROR', collection, response, options);
                }
            });
        let movieSourceTwo = new movieSourceTwo();
        movieSourceTwo.fetch({
            success: function (collection, response, options) {
                movieCollection = [...movieCollection, ...response.data];
            },
            error: function(collection, response, options) {
                console.info('~ Response::ERROR', collection, response, options);
            }
        });
        this.collection = movieCollection;
    },

Я получаю ошибку A “url” property or function must be specified есть ли способ, где Я могу сделать это без использования URL-адреса в коллекции магистрали? Примечание: я хочу, чтобы две конечные точки оставались независимыми, так как я не хочу, чтобы сборник завершился сбоем в случае сбоя основного API.

1 Ответ

0 голосов
/ 10 мая 2020

Чтобы избежать этой ошибки с помощью url, вы должны переопределить свой метод fetch, чтобы вместо этого вызвать обе коллекции fetch.

function promisifyFetch(collection) {
  return new Promise(function(resolve, reject) {
    collection.fetch({
      success() {
        resolve(collection);
      },

      error() {
        reject();
      }
    });
  });
}

module.exports = Backbone.Collection.extend({
  model: TopMovieModel,

  initialize() {
    this.movieSourceOne = new TopMovieFromSourceOne();
    this.movieSourceTwo = new movieSourceTwo();
  },

  fetch(options) {
    return Promise.all([
      promisifyFetch(this.movieSourceOne),
      promisifyFetch(this.movieSourceTwo)
    ]).then(([one, two]) => {
      const response = [
        ...one.toJSON(),
        ...two.toJSON()
      ];

      this.set(response, options);
      this.trigger('sync', this, response, options);
    });
  }
});

Вероятно, вы также захотите обрабатывать ошибки здесь.

...