# 13.6 Загрузка данных

При обращении к свойствам типа `Object` или `List of Objects` вы можете запросить данные, которые еще не посылались веб сервером Bubble в браузер пользователя. Например, у вас есть свойство в виде списка `my_list` , вы совершаете вызов`properties.my_list.get(0,99)` , и часто бывает так, что первые 100 записей списка еще не загружались с сервера.

Опытные javascript программисты знакомы с асинхронной загрузкой данных с помощью функций обратного вызова. Вместо этого мы попытаемся управлять автоматической загрузкой данных в фоновом режиме. В большинстве случаев мы можем написать код так, будто бы `propetties.my_list.get(0,99)` возвращает значение мгновенно, а не асинхронного, даже если в фоне вам нужно было обратиться к серверу для получения ответа.

Далее последует краткое объяснения того, как реализуется этот фоновый функционал. По большей части вы не увидите практической разницы, но есть некоторые ситуации, когда результат будет не тем, которого вы ожидали, если вы не понимаете, как это на самом деле работает.

Когда ваш код обращается к данным, которых нет в браузере, происходит две вещи:

1. Мы мгновенно отправляем асинхронный запрос на веб сервер для загрузки данных.
2. Мы выдаем ошибку, которая прерывает выполнение написанной вами функции и сообщает API, что мы ждем данные для продолжения работы.

После того, как данные загружены, мы перезапускаем исполнение функции. На этот раз, когда мы запросим данные, они будут доступны, и выполнение функции будет продолжено.

Для вас эта механика имеет два последствия:

1. Функции, которые вы запускаете один раз, такие как выполнение действия, фактически могут запускаться множество раз, так как мы последовательно загружаем данные, к которым обращается функция. Аналогично, для элемента функция `update` будет перезапускаться  не только при изменении свойств этого элемента, но и в моменты окончания загрузки запрошенных вами данных или их последующего изменения.
2. Выражения `try...catch` , которые содержат функции загрузки данных, будут ловить выдаваемую нами ошибку, что приведет к неправильной работе данного механизма.

Для того, чтобы избежать этих проблем, вызванных ошибками в вашем коде, мы рекомендуем две лучшие практики.

Во-первых, всегда загружайте данные перед началом выполнения ваших функций, перед изменением любых внешних для функции состояний. Например, если вы создаете элемент, который принимает в себя список и отображает его в браузере, загружайте список отображаемых элементов, как и любые поля этих элементов перед тем, как изменять объектную модель документа (DOM). Мы рекомендуем делать именно так, потому что если какие-то данные не готовы, ваш код не будет вносить никаких изменений до загрузки всех данных. И наоборот, если вы написали функцию, которая загружает первые несколько первых элементов списка, отображает их, а затем загружает еще часть, вы можете столкнуться с ситуацией, что первые несколько элементов будут отображаться несколько раз.

Во-вторых, либо избегайте помещения кода загрузки данных в `try...catch` , либо, если вам нужно это сделать, то убедитесь, что вы заново возвращаете специальные ошибки. Эти ошибки вы можете обнаружить, посмотрев свойство message: оно должно быть "not ready"/"не готово".

Например:

```
try { 
    var myData = properties.my_list.get(0,99);
    doSomethingWith(myData);
} catch (err) {
    //Re-throw not-ready errors...
    if (err.message === 'not ready') {
        throw err;
    }
    //And handle other errors...
    myErorrHandlingLogic(err);
}
```
