Javascript promise — промисификация кода

promiseИспользование promise для улучшения читаемости кода и избавления от callback-hell’a.

Я разрабатывал своего бота в процессе изучения Javascript и не сильно запаривался о виде кода и о хороших практиках и наваратил там такой лапши из callback’ов, что сам уже не мог им дать ладу и когда сайт донор немного поменял верстку бот перестал нормлаьно работать, при попытке его починить все стало только хуже, ибо я больше и больше запутывался в своем же коде.

Собственно это и стало триггером моего решения переписать бота, да так что б код был читаемым и не было этой лапши из callback’ов. Мне посоветовали посмотреть JS promise’ы.

Promise — являются альтернативой использования callback-функций при работе с асинхронным кодом. Promise – это специальный объект, который содержит своё состояние. Вначале pending(«ожидание»), затем – одно из: fulfilled («выполнено успешно») или rejected («выполнено с ошибкой»).

/* Внутри вызываем любую асинхронную функцию */
async_call(function(err) {
  /*В случае ошибки вызываем reject*/
  if(err) reject(err);
  /* В случае успешного выполнения вызываем */
  resolve(result);
});
promise.then(function(result) {
 /* Сюда мы попадем в случае успешного завершения асинхронной операции,
  * вызова resolve */
}).catch(function(err) {
 /* Сюда мы попадем в случае неуспешного завершения асинхронной операции,
  * вызова reject или возникновения исключения */
});

Важной особенностью использования промисов является возможность их сцепления(chaining) между собой.

promise.then(function(result) {
  /* Сюда мы попадем в случае успешного завершения асинхронной операции,
   * вызова resolve */
  return function_that_return_promise();
}).then({
  /* Сюда мы попадем после вызова resolve в function_that_return_promise */
}).catch(function(err) {
  /* Сюда мы попадем после вызова reject в одной из функций */
});

Так же довольно часто необходимо в процессе обхода массива, например, функцией forEach запустить несколько промисов и потом дождаться их выполнения. Это реализуется с помощью встроенной функции Promise.all(array).

var promises = [];
some_array.forEach(element) {
  /* Создаем массив промисов */
  promises.push(function_that_return_promise(element));
}
 
Promise.all(promises).then(function(results) {
  /* будет вызвана после завершения всех промисов из массива */
})

Подробней можно почитать:

dreamway89

dreamway89 wrote 29 posts

Post navigation


Добавить комментарий

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>