Backbone Collection выдает ошибку при получении ответа сервера - PullRequest
1 голос
/ 01 октября 2011

Я делаю твиттер-клиент для своих друзей, и я делаю это с помощью Backbone.js и php-бэкенда, используя Twitter oAuth API.

Итак, вот сценарий:

  1. пользователь аутентифицируется
  2. Магистральное приложение инициализирует и отправляет первый запрос: window.timeline.fetch ();
  3. window.timeline - это базовая коллекция, и ее URL-адрес: / connect / timeline /
  4. сервер возвращает 10 последних твитов в json, а window.timeline добавляет их с использованием модели Tweet и сохраняет последний идентификатор твита в переменной.
  5. отображение основы отображает и показывает их и запускает таймер
  6. Таймер начинает тикать и запускает window.timeline.fetch ({add: true}); каждые 10 секунд и добавляет / ID / добавление конца URL-адреса для извлечения, чтобы Twitter API возвращал твиты с этого идентификатора
  7. поскольку я передал опцию добавления, когда сервер возвращает объект, он вызывает событие «добавить», и я связываю его с методом, который добавляет каждый твит и верхнюю часть списка и сохраняет последний идентификатор твита для использования в следующем таймере. тик.

проблема в том, что твитер иногда возвращает один и тот же твит дважды (например, RT и прочее), и поскольку этот идентификатор существует в магистральной коллекции, он выдает такую ​​ошибку:

Uncaught Error: невозможно добавить одну и ту же модель в набор дважды, 119896811958833150

и выходит из программы. как я могу контролировать эту ситуацию? или есть лучший способ сделать это?

window.Tweet  = Backbone.Model.extend({});
window.Timeline = Backbone.Collection.extend({
    model: Tweet,
    url: function(){
        var id = (window.lastId) ? window.lastId + "/?" + Math.floor(Math.random()*99999) : "";
        return "/connect/timeline/" + id;
    }
});

Спасибо (и извините за мой английский)

1 Ответ

1 голос
/ 01 октября 2011

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

Учитывая, что это источник вашей проблемы, у вас есть по крайней мере два варианта решения:

  • Поддерживайте некоторый флаг, который бы указывал, ожидаете ли вы ответа сервера.Это позволит вам предотвратить одновременную отправку двух запросов от одного и того же клиентского экземпляра.ПРИМЕЧАНИЕ. Это не то же самое, что синхронные запросы.Последний блокирует ваш пользовательский интерфейс!
  • Вы также можете проверить, существует ли твит с возвращенным идентификатором, и только после этого продолжить.Однако это немного опасно, потому что это может скрыть более глубокую проблему с вашей реализацией.

РЕДАКТИРОВАТЬ

Я думаю, что ваша проблема - это просто URL/timeline/SOME-ID-HERE возвращает все новейшие твиты до указанного идентификатора включительно .Я проверил содержание запросов, отправляемых вашими приложениями.Первый /timeline длинный и заканчивается идентификатором 119912841942802432.И это единственный идентификатор, который возвращается в вашем втором запросе.

Чего я не понимаю, так это как идентификатор в адресе связан с идентификаторами ваших твитов.Адрес второго запроса /timeline/119912841942802430.С другой стороны, 119912841942802430 ничего не соответствует в результатах.119912841942802432 (обратите внимание 2 вместо 0 в конце).

...