-
Notifications
You must be signed in to change notification settings - Fork 3
lazy load
#Lazy Load ЛЕНИВАЯ ЗАГРУЗКА
Во время работы с объектами МойСклад удобно пользоваться загрузкой не только данных самого объекта, но и сопряжённых с ним сущностей методом Lazy Load (ленивая загрузка). Это делает загрузку данных проще для разработчика: он просто использует объект, который динамически подгружает необходимые связанные сущности в момент обращения.
##Принцип работы
Сущность МойСклад может содержать ссылку на связанный объект ввиде поля с идентификатором. Наименование поля всегда заканчивается на Uuid
. Например, заказ order
содержит поле sourceAgentUuid
с идентификатором контрагента оформившего заказ. После активации ленивого загрузчика в order
будет добавлено свойство sourceAgent
, при обращении к которому сущность контрагента динамически подгрузится.
var client = require('moysklad-client').createClient();
// Загрузка заказа
var order = client.from('customerOrder').first();
console.log(order.sourceAgentUuid);
// → 2eb58a05-ae73-11e2-fa2c-001b21d41495
console.log(order.sourceAgent.name);
// → TypeError: Cannot read property 'name' of undefined
// Создание ленивого загрузчика
var lazyLoader = client.createLazyLoader();
// Привязка ленивого загрузчика к заказу
lazyLoader.attach(order);
console.log(order.sourceAgent.name);
// → ООО "Ромашка"
Ленивый загрузчик автоматически привязывается к подгружаемым объектам, поэтому цепочку обращений к связанным сущностям можно продолжать.
console.log('Статус клиента - ' + order.sourceAgent.state.name);
// → Статус клиента - Активный
Все загруженные объекты кешируются и не подгружаются при повторном обращении.
##Использование
###client.createLazyLoader() Создание экземпляра ленивого загрузчика
var client = require('moysklad-client').createClient();
var lazyLoader = client.createLazyLoader();
Созданный экземпляр ленивого загрузчика будет использовать экземпляр client
для загрузки связанных сущностей.
####Return
lazyLoader
- экземпляр ленивого загрузчика
###lazyLoader.attach(obj [, batchLoad])
Привязывает ленивый загрузчик к объекту.
lazyLoader.attach(order);
####Parameters
Наименование | Тип | Описание |
---|---|---|
obj |
Object или Array
|
объект или массив объектов к которым необходимо привязать загрузчик |
batchLoad |
Array |
список путей к методам для пакетной загрузки |
####Пакетная загрузка сущностей Часто возникает ситуация, когда необходимо обращаться к связанным сущностям в массиве, например вывести список товаров в заказе. В этом случае, при преборе массива товаров, будет осуществлятся отдельный запрос к серверу для каждого товара, что очень накладно.
Для решения описанной выше проблемы, в ленивом загрузчике существует понятие пакетной загрузки, когда в момент обращения к одному из элементов массива, будут динамически загружены все остальные.
Для включения пакетной загрузки необходимо передать массив batchLoad
относительных путей к свойствам (внутри сущности) которые нужно загрузить единовременно при обращении к однму из этих свойств.
Путь "good"
, соответствует любому свойству goodUuid
, в то время как "customerOrderPosition.good"
всем свойствам goodUuid
только внутри массива "order.customerOrderPosition"
.
Заданный путь сравнивается с фактическим с конца строки, поэтому "customerOrderPosition.good"
, "OrderPosition.good"
или "Position.good"
для объекта заказа сработают одинаково.
lazyLoader.attach(order, [ 'Position.good' ]);
var goodName3 = order.customerOrderPosition[3].good.name;
// во время выполнения операции lazyLoader загрузил все объекты good внутри каждой позиции массива customerOrderPosition пакетно одним запросом и сохранил в кеш.
var goodName4 = order.customerOrderPosition[4].good.name;
// объект товара считан из кеша без обращения к серверу
####Вспомогательные методы
Помимо дополнительных свойств для доступа к связанным сущностям, ленивый загрузчик привязывает к объекту вспомогательные методы moysklad.tools
.
Методы привязываются в зависимости от типа сущности.
Тип сущности / Условие | Привязанные методы moysklad.tools
|
---|---|
entity |
instanceOf , getProperty
|
order |
reserve |
operationWithPositions |
getPositions |
Сущность содержит поле attribute
|
getAttr , getAttrValue
|
Сущность содержит поле salePrices
|
getPrice , getPriceValue
|
lazyLoader.attach(order);
// Получение значение атрибута
var attr = order.getAttrValue('af18c948-4d2c-43d8-9fe1-282d65eb9960');
// Проверка типа по объектной модели
var isOrder = order.instanceOf('order'); // → true
// Зарезервировать заказ
order.reserve();