0.0.4 • Published 6 years ago

long-api-task-requester v0.0.4

Weekly downloads
1
License
ISC
Repository
github
Last release
6 years ago

long-task-requester

Библиотека-обертка для обработки долгих запросов в АПИ

Работает независимо от платформы (браузер или nodejs) или используемых технологий/фреймворков в рамках платформы.

Принцип взаимодействия фронтенда (браузер или nodejs) и АПИ


  • фронтенд отправляет в АПИ запрос за данными
  • АПИ
    • понимает, что может ответить быстро, и сразу отвечает с нужными данными со statusCode: 200
    • отвечает со statusCode: 201, и в теле ответа возвращает id задачи { task_id: '<ID>'}
  • фронтенд, в случае 201, через определенный интервал времени начинает отправлять запросы в специальную ручку АПИ, передавая туда полученный id задачи, проверяя статус выполнения задачи.
  • на эти запросы, АПИ отвечает
    • statusCode: 200 и ожидаемыми данными, и на этом все заканчивается
    • statusCode: 102 и числом от 0 до 100, для отображения состояния выполнения запроса на фронтенде, что говорит о том, что задача еще выполняется на стороне АПИ

Пример использования


Из браузера

Собранный клиентский бандл лежит в dist/index.js.

// функция, выполняющая основной запрос за данными, возвращающая промис,
// который будет в любой случае зарезолвлен с данными в специальном формате:
// хэш c полями  statusCode, data/error ( статус код, и то, чем ответило АПИ ).
var mainRequstFunc = function() {
    // например, у вас на сервисе есть jQuery-промисы.
    var _deferred = new $.Deferred();

    // например, jQuery
    someRequestLibrary({
        url: 'https://api.myservice.ru/offer/save',
        method: 'POST'
    })
        .then(
            function(data) {
                _deferred.resolve({ data: data, statusCode: req.statusCode });
            },
            function(error) {
                _deferred.resolve({ error: error, statusCode: req.statusCode });
            }
        );

    return _deferred.promise();
};

// функция, вызвав которую и передав id задачи, 
// возвращающая запрос за статусом задачи или данными (когда задача выполнена)
var taskStatusFunc = function(taskID) {
    return function() {
        var _deferred = new $.Deferred();

        someRequestLibrary({
            url: 'https://api.myservice.ru/task_status',
            method: 'POST'
        })
            .then(
                function(data) {
                    _deferred.resolve({ data: data, statusCode: req.statusCode });
                },
                function(error) {
                    _deferred.resolve({ error: error, statusCode: req.statusCode });
                }
            );

        return _deferred.promise();
    };
}

// вызывается, когда нужно обновить состояние progressBar'a
var progressBarCallback = function(percent) {
    progressBar.set(percent);
}

// вызовется, когда нужно будет спрятать progressBar. Перед resolve/reject промиса.
var hideProgressBarCallback = function() {
    progressBar.hide();
}

// через totalTimeout msec промис будет rejected c ошибкой longTaskRequester.TimedOutError
var totalTimeout = 10000;

// через softTimeout msec всегда будет вызван progressBarCallback(0),
// даже если еще не делался вызов taskStatusMessage
var softTimeout=100;

// время между запросами за статусом задачи
var pollTimeout = 1000;

longTaskRequester.create(
    progressBarCallback,
    hideProgressBarCallback,
    mainRequstFunc,
    taskStatusFunc,
    totalTimeout, // необязательный аргумент, по-умолчанию 20000ms
    softTimeout, // необязательный аргумент, по-умолчанию 100ms
    pollTimeout // необязательный аргумент, по-умолчанию 1000ms
)
    .run()
    .then(
        function(response) {},
        function(error) {
            if (error instanceof longTaskRequester.TimedOutError) {
                return alert('TIMEOUT ERROR');
            }
        }
    )
    .then(function() {
        // :)
        // this.delMod('progress');
    }.bind(this));