0.0.4 • Published 6 years ago
long-api-task-requester v0.0.4
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));
0.0.4
6 years ago