Skip to content
Makeev Vitaliy edited this page Jul 19, 2014 · 6 revisions

#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();

перейти к заголовку