Giter VIP home page Giter VIP logo

andrey-tech / bx24-wrapper-js Goto Github PK

View Code? Open in Web Editor NEW
29.0 3.0 13.0 87 KB

Класс-обертка для стандартной JS-библиотеки Битрикс24. Позволяет избежать ада колбеков и работать c REST API Битрикс24, используя асинхронные функции и асинхронные генераторы ECMAScript 9.

License: MIT License

JavaScript 100.00%
bitrix24 bitrix async-await async generator javascipt api await throttling async-generator ecmascript2018

bx24-wrapper-js's Introduction

Bitrix24 JS-lib Wrapper

Bitrix24 logo

Latest Stable Version GitHub stars GitHub forks GitHub watchers License

Класс-обертка на JavaScript для стандартной JS-библиотеки Битрикс24. Данный класс позволяет избежать ада колбеков и работать c API Битрикс24 с помощью асинхронных функций и асинхронных генераторов ECMAScript 9.

Разработчики на PHP могут воспользоваться классом-оберткой andrey-tech/bitrix24-api-php.

Содержание

Требования

  • Стандартная JS-библиотека Битрикс24 v1.0, которая представляет собой JavaScriptS SDK для REST API, что позволяет обращаться к API прямо из front-end приложения не погружаясь в реализацию авторизации по OAuth 2.0. Для внешних приложений и вебхуков библиотека использоваться не может.

Подключение стандартной библиотеки Битрикс24 v1.0:

<script src="//api.bitrix24.com/api/v1/"></script>

Класс BX24Wrapper

Создание нового объекта класса BX24Wrapper:

  • new BX24Wrapper();

Дополнительные параметры работы устанавливаются через свойства объекта класса BX24Wrapper.

Свойство По умолчанию Описание
batchSize 50 Максимальное число команд в одном пакете запросе (не более 50)
throttle 2 Максимальное число запросов к API в секунду (не более 2-х запросов в секунду)
progress percent => {}; Функция для контроля прогресса выполнения запросов в методах callListMethod(), fetchList(), callLongBatch() и callLargeBatch() (percent - прогресс 0-100, %)
(async () => {
    let bx24 = new BX24Wrapper();

    // Устанавливаем максимальное число команд в одном пакете запросе
    bx24.batchSize = 25;
    
    // Устанавливаем троттлинг запросов к API Битрикс24 на уровне 0,5 запросов в секунду,
    // то есть 1 запрос в 2 секунды
    bx24.throttle = 0.5;

    // Устанавливаем собственную функцию для вывода в веб-консоль прогресса выполнения запросов в процентах
    bx24.progress = percent => console.log(`Progress: ${percent}%`);

})().catch(error => console.log('Error:', error));

Методы класса BX24Wrapper

Метод async callMethod()

Вызывает указанный метод REST-сервиса с заданными параметрами и возвращает объект Promise (промис).
Обертка метода callMethod стандартной библиотеки Битрикс24.

  • callMethod(method [, params = {}, dataExtractor = null ]);
    Параметры:
    • string method - строка, указывающая вызываемый метод REST-сервиса;
    • object params - объект параметров для метода REST-сервиса;
    • function dataExtractor - функция для извлечения данных из результатов запроса.
(async () => {
    let bx24 = new BX24Wrapper();

    // Загружаем компанию по её ID
    let company = await bx24.callMethod('crm.company.get', { ID: 6 });
    console.log('Company:', company);

})().catch(error => console.log('Error:', error));

Метод async callListMethod()

Вызывает указанный списочный метод REST-сервиса с заданными параметрами и возвращает объект Promise (промис). Позволяет одним вызовом загружать произвольное число сущностей с фильтрацией по параметрам в виде массива объектов и контролировать прогресс выполнения загрузки.

  • callListMethod(listMethod [, params = {}, dataExtractor = null ]);
    Параметры:
    • string listMethod - строка, указывающая вызываемый списочный метод REST-сервиса;
    • object params - объект параметров для списочного метода REST-сервиса;
    • function dataExtractor - функция для извлечения данных из результатов запроса.
(async () => {
    let bx24 = new BX24Wrapper();

    // Устанавливаем собственную функцию для вывода в веб-консоль прогресса выполнения запросов в процентах
    bx24.progress = percent => console.log(`progress: ${percent}%`);

    let params = {
        filter: { CATALOD_ID: 21 },
        select: [ '*', 'PROPERTY_*' ]
    };

    // Загружем список всех товаров в заданном товарном каталоге CRM
    let products = await bx24.callListMethod('crm.product.list', params);
    for (let product of products) {
        console.log('Product:', product);
    }

    params = {
        filter: { iblockId: 11 },
        select: [ '*', 'id', 'iblockId' ]
    };
    
    // Задаем собственную функцию для извлечения массива товаров из объекта с результатами запроса
    let dataExtractor = data => data.products;
    
    // Загружем список всех товаров в заданном товарном каталоге
    products = await bx24.callListMethod('catalog.product.list', params, dataExtractor);
    for (let product of products) {
        console.log('Product:', product);
    }

})().catch(error => console.log('Error:', error));

Метод async *fetchList()

Вызывает указанный списочный метод REST-сервиса с заданными параметрами и возвращает объект Generator (генератор). Позволяет одним вызовом загружать произвольное число сущностей с фильтрацией по параметрам в виде массива объектов и контролировать прогресс выполнения загрузки.

Реализует быстрый алгоритм, описанный в статье "Как правильно выгружать большие объемы данных". Использование асинхронного генератора дает существенную экономию памяти при обработке большого количества сущностей.

  • fetchList(listMethod [, params = {}, dataExtractor = null, idKey = 'ID' ]);
    Параметры:
    • string listMethod - строка, указывающая вызываемый списочный метод REST-сервиса;
    • object params - объект параметров для списочного метода REST-сервиса;
    • function dataExtractor - функция для извлечения данных из результатов запроса;
    • string idKey - имя поля ID загружаемых сущностей (ID - CRM или id).
(async () => {
    let bx24 = new BX24Wrapper();

    // Устанавливаем собственную функцию для вывода в веб-консоль прогресса выполнения запросов в процентах
    bx24.progress = percent => console.log(`progress: ${percent}%`);

    let params = {
        filter: { CATALOD_ID: 21 }
    };

    // Загружем список всех товаров в заданном товарном каталоге CRM, используя асинхронный генератор
    let generator = bx24.fetchList('crm.product.list', params);
    for await (let products of generator) {
        for (let product of products) {
            console.log('Product:', product);
        }
    }

    params = {
        filter: { iblockId: 11 },
        select: [ '*', 'id', 'iblockId' ]
    };    
    
    // Задаем собственную функцию для извлечения массива товаров из объекта с результатами запроса   
    let dataExtractor = data => data.products;
    
    // Задаем имя поля ID загружаемых сущностей (товаров) в результатах запроса
    let idKey = 'id';

    // Загружем список всех товаров в заданном товарном каталоге, используя асинхронный генератор
    generator = bx24.fetchList('catalog.product.list', params, dataExtractor, idKey);
    for await (let products of generator) {
        for (let product of products) {
            console.log('Product:', product);
        }
    }
        
})().catch(error => console.log('Error:', error));

Метод async callBatch()

Отправляет пакет запросов к REST-сервису с максимальным числом команд в запросе 50 и возвращает Promise (промис). Позволяет получить результаты пакетного выполнения запросов в виде массива или объекта. Обертка метода callBatch стандартной библиотеки Битрикс24.

  • callBatch(calls [, haltOnError = true, dataExtractor = null ]);
    Параметры:
    • array|object calls - пакет запросов в виде массива или объекта;
    • bool haltOnError - флаг "прерывать исполнение пакета в при возникновении ошибки";
    • function dataExtractor - функция для извлечения данных из результатов запроса.
(async () => {
    let bx24 = new BX24Wrapper();

    // Пакет запросов в виде массива с максимальным числом команд в запросе 50
    let calls = [
        [ 'crm.deal.get', { id: 2880 } ],
        [ 'crm.contact.get', { id: 8 } ],
        [ 'crm.company.get', { id: 6 } ]
    ];

    // Отправляем пакет запросов в виде массива
    let response = await bx24.callBatch(calls, false);
    console.log('Response array:', response);

    // Пакет запросов в виде объекта с максимальным числом команд в запросе 50
    calls = {
        get_deal: [ 'crm.deal.get', { id: 2880 } ],
        get_company: [ 'crm.company.get', { id: '$result[get_deal][COMPANY_ID]' } ],
        get_contact: [ 'crm.contact.get', { id: '$result[get_deal][CONTACT_ID]' } ]
    };

    // Отправляем пакет запросов в виде объекта
    response = await bx24.callBatch(calls);
    console.log('Response object:', response);

})().catch(error => console.log('Error:', error));

Метод async callLongBatch()

Отправляет пакет запросов к REST-сервису в виде массива с произвольным числом команд в запросе и возвращает Promise (промис). Позволяет получить результаты пакетного выполнения запросов в виде массива.

  • callLongBatch(calls [, haltOnError = true, dataExtractor = null ]);
    Параметры:
    • array calls - пакет запросов в виде массива;
    • bool haltOnError - флаг "прерывать исполнение пакета в при возникновении ошибки";
    • function dataExtractor - функция для извлечения данных из результатов запроса.
(async () => {
    let bx24 = new BX24Wrapper();

    // Длинный пакет запросов в виде массива с произвольным числом команд в запросе
    let calls = [
        [ 'crm.deal.get', { id: 2880 } ],
        [ 'crm.contact.get', { id: 8 } ],
        [ 'crm.company.get', { id: 6 } ],
        [ 'crm.product.get', { id: 1 } ]
    ];

    // Отправляем длинный пакет запросов в виде массива
    let response = await bx24.callLongBatch(calls);
    console.log('Response array:', response);

})().catch(error => console.log('Error:', error));

Метод async *callLargeBatch()

Отправляет пакет запросов к REST-сервису в виде массива с произвольным числом команд в запросе и возвращает Generator (генератор). Позволяет получить результаты пакетного выполнения запросов в виде массива. Использование асинхронного генератора дает существенную экономию памяти при работе с длинными пакетами запросов.

  • callLargeBatch(calls [, haltOnError = true, dataExtractor = null ]);
    Параметры:
    • array calls - пакет запросов в виде массива;
    • bool haltOnError - флаг "прерывать исполнение пакета в при возникновении ошибки";
    • function dataExtractor - функция для извлечения данных из результатов запроса.
(async () => {
    let bx24 = new BX24Wrapper();

    // Длинный пакет запросов в виде массива с произвольным числом команд в запросе
    let calls = [
        [ 'crm.deal.get', { id: 2880 } ],
        [ 'crm.contact.get', { id: 8 } ],
        [ 'crm.company.get', { id: 6 } ],
        [ 'crm.product.get', { id: 1 } ]
    ];

    // Отправляем длинный пакет запросов в виде массива, используя асинхронный генератор
    let generator = bx24.callLargeBatch(calls, true);
    for await (let response of generator) {
        console.log('Response array:', response);
    }

})().catch(error => console.log('Error:', error));

Метод static createCalls()

Создает пакет однотипных запросов для методов callBatch(), callLongBatch() и callLargeBatch() и возвращает пакет запросов в виде массива.

  • BX24Wrapper.createCalls(method, items);
    Параметры:
    • string method - строка, указывающая вызываемый метод REST-сервиса во всех запросах;
    • array items - массив параметров запросов.
(async () => {
    let bx24 = new BX24Wrapper();

    // Массив параметров однотипных запросов
    let items = [
        { id: 4 },
        { id: 6 },
        { id: 8 }
    ];

    // Создаем пакет запросов в виже массива
    let calls = BX24Wrapper.createCalls('crm.contact.get', items);

    // Отправляем пакет запросов в виде массива
    let response = await bx24.callBatch(calls);
    console.log('Response:', response);
  
})().catch(error => console.log('Error:', error));

Метод getLastResult()

Возвращает последний объект ajaxResult, полученный от стандартной библиотеки Битрикс24.

  • getLastResult();

Обработка ошибок

При возникновении ошибок в методах класса выбрасываются исключения.
Последний объект ajaxResult, полученный от стандартной библиотеки Битрикс24, может быть получен посредством метода getLastResult().

(async () => {

    let bx24 = new BX24Wrapper();

    // Загружаем несуществующую компанию по её ID и перехватываем возникающее исключение
    let company = await bx24.callMethod('crm.company.get', { ID: 9999999999 })
        .catch(error => {
            console.log('Error:', error);
            
            // Получаем последний объект ajaxResult, полученный от стандартной библиотеки Битрикс24
            let ajaxResult = bx24.getLastResult();
            console.log('ajaxResult:', ajaxResult);
        });

})().catch(error => console.log('Error:', error));

Автор

© 2019-2023 andrey-tech

Лицензия

Данный класс распространяется на условиях лицензии MIT.

bx24-wrapper-js's People

Contributors

andrey-tech avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

bx24-wrapper-js's Issues

вопрос по прогресс бару при запросах к информационным блокам

подскажите пожалуйста (Б24/облако)
для запросов к crm
( let products = await bx24.callListMethod('crm.product.list', params);)
прогресс отрабатывает нормально
(bx24.progress = percent => console.log(progress: ${percent}%);)

для запросов к инфоблокам
( let products = await bx24.callListMethod('catalog.product.list', params);)
прогресс бар не возвращает (или возвращает некорректный процент)
image
это результат прогресса для 2675 записей

сами данные приходят нормально - а от прогресса только факт срабатывания в консоли фактически
image

можно ли это как то поправить?

ps
с инфоблоками ('catalog.product...) вообще какая-то засада особенно для методов генераторов (fetch ) и в js и в php обертке (больше 50 не итерируются). Использовать crm для товаров не могу поскольку каталог смешанный и простые товары и торговые предложения и техподдержка б24 настоятельно рекомендует использовать методы catalog...

вопрос - как получить данные батча await bx24.callBatch(calls); в случае ошибки в одном из запросов

Андрей - подскажите пожалуйста как из запроса
deal_link = await bx24.callBatch(cmd_link, false); //С УЧЕТОМ БИТЫХ ССЫЛОК - ПОДАВЛЯЕМ ОШИБКИ
получить то что пришло из батча если в одном из запросов батча была ошибка - в плане синтаксиса...

вызов типа

(async () => {
    let bx24 = new BX24Wrapper();
... допустим 10 запросов - на пятом битая ссылка  (удаленный id - объект в корзине)
    response = await bx24.callBatch(calls, false);
})().catch(error => console.log('Error:', error));

вернет в catch конкретную ошибку допустим на пятом запросе - но кроме того батч возвращает еще и данные остальных 9 запросов на которых ошибки небыло - вот как их достать? (как прочесть все что пришло и result и result_error)

в моем случае это выглядит в отладчике браузера как
набираю батч - отправляю
image
в catch вылетаю с ошибкой
image
потом на вкладке сеть смотрю что пришло
image
вижу что данные есть, а как их достать?
как правильно на js написать (не специалист в программировании)

в общем не получается дождаться выполнения всего батча целиком... вылетаю на ошибку до его окончания...
))

ошибка в примере из README.md

вот тут
let generator = bx24.fetchList('crm.product.list', params);
for await (let products of generator) {
for (let product as $products) {
console.log('Product:', product);
}
}

as и $

проблемы с bx24.fetchList('catalog.product.list', params)

добрый день, не подскажите, никак не могу запустить bx24.fetchList конкретно для catalog.product.list
первая пачка поступает и потом сразу ошибка (возможно только для этого запроса)

(async () => {
    let bx24 = new BX24Wrapper();

    // Устанавливаем собственную функцию для вывода в веб-консоль прогресса выполнения запросов в процентах
    bx24.progress = percent => console.log(`progress: ${percent}%`);

    let params = {
			filter: { iblockId: 21},//,id: 10093 },
			select: [ 'id', 'iblockId']
    };

/*
    // Загружаем список всех товаров в заданном товарном каталоге
    let products = await bx24.callListMethod('catalog.product.list', params);
    for (let product of products) {
        console.log('Product:', product);
    }
*/
    // Загружаем список всех товаров в заданном товарном каталоге используя асинхронный генератор
    let generator = bx24.fetchList('catalog.product.list', params);
    for await (let products of generator) {
        for (let product of products) {
            console.log('Product:', product);
        }
    }


})().catch(error => console.log('Error:', error));

после первого шага
bx24.progress = percent выдает [Nan ](progress: NaN%)
и дальше при попытке итерации
for (let product of products) {
сообщение Error: TypeError: products is not iterable
ps
...может в этом проблема что этот итератор синхронный?
или
https://spec-zone.ru/javascript/errors/is_not_iterable
в общем - не разбираюсь в этом

картинка (хром)

1
3
если тоже самое делаем для запроса crm.product.list - все работает

	params = {
	    filter: { CATALOD_ID: 21 },
	    select: [ 'ID', 'ACTIVE', 'NAME','ID', 'PRICE', 'CURRENCY_ID', 'VAT_ID', 'VAT_INCLUDED', 'UF_*' ]
				};

на входе такой же массив - отличие только в том что значения в кавычках приходят
2

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.