Вызов fetch
является асинхронным, поскольку включает в себя AJAX-вызов на сервер:
fetch collection.fetch ([опции])
Извлекает набор моделей по умолчанию для этой коллекции с сервера, сбрасывая коллекцию по прибытии.
И fetch
вызовет parse
:
parse collection.parse (response)
parse вызывается Backbone всякий раз, когда сервер возвращает модели коллекции в fetch
.
Так что p.parse()
можно вызывать до или после p.fetchPage()
, в зависимости от проблем синхронизации, которые находятся вне вашего контроля.
В первом случае:
> p = new Pictures(); p.fetch(); p.fetchPage();
fetchPage
вызывается до того, как fetch
получит ответ от сервера и приступит к вызову parse
, поэтому последовательность вызова заканчивается следующим образом:
- Вы звоните
p.fetch()
. - Выполнен вызов AJAX.
- Вы звоните
p.fetchPage()
. - Ответ AJAX получен.
- Обработчик успеха AJAX вызывает
p.parse()
.
Во втором случае:
> p = new Pictures(); p.fetch()
> p.fetchPage();
Между строками проходит достаточно времени для возврата вызова AJAX до того, как p.fetchPage()
вызывается таквсе происходит в порядке, ожидаемом случайно.
Если вам нужно, чтобы события происходили в определенном порядке, вам нужно будет использовать обратный вызов success
(и, возможно, error
), который обеспечивает fetch
:
Опции hash принимают success
и error
обратные вызовы, которые будут переданы (collection, response)
в качестве аргументов.
Так что это должнодаст вам последовательный результат 2:
p = new Pictures();
p.fetch({
success: function(collection, response) {
collection.fetchPage();
console.log(collection.foobar);
}
});
Конечно, если fetchPage
включает вызов AJAX, вам придется добавить еще один уровень обратных вызовов, чтобы получить согласованное значение foobar
.