update promises
This commit is contained in:
41
docs/javascript/08-promises/05-promisification.md
Normal file
41
docs/javascript/08-promises/05-promisification.md
Normal file
@@ -0,0 +1,41 @@
|
||||
---
|
||||
sidebar_position: 5
|
||||
---
|
||||
|
||||
# Промисификация
|
||||
Источник: [https://learn.javascript.ru/promisify](https://learn.javascript.ru/promisify)
|
||||
|
||||
Промисификация – это длинное слово для простого преобразования. Мы берём функцию, которая принимает колбэк и меняем её, чтобы она вместо этого возвращала промис.
|
||||
|
||||
Такие преобразования часто необходимы в реальной жизни, так как многие функции и библиотеки основаны на колбэках, а использование промисов более удобно, поэтому есть смысл «промисифицировать» их.
|
||||
|
||||
💥 **На заметку:**
|
||||
- Промисификация – это отличный подход, особенно, если вы будете использовать async/await (см. следующую главу об Async/await) но она не является тотальной заменой любых колбэков.
|
||||
- Помните, промис может иметь только один результат, но колбэк технически может вызываться сколько угодно раз.
|
||||
- Поэтому промисификация используется для функций, которые вызывают колбэк только один раз. Последующие вызовы колбэка будут проигнорированы.
|
||||
|
||||
```js
|
||||
// promisify(f, true), чтобы получить массив результатов
|
||||
function promisify(f, manyArgs = false) {
|
||||
return function (...args) {
|
||||
return new Promise((resolve, reject) => {
|
||||
function callback(err, ...results) { // наш специальный колбэк для f
|
||||
if (err) {
|
||||
reject(err);
|
||||
} else {
|
||||
// делаем resolve для всех results колбэка, если задано manyArgs
|
||||
resolve(manyArgs ? results : results[0]);
|
||||
}
|
||||
}
|
||||
|
||||
args.push(callback);
|
||||
|
||||
f.call(this, ...args);
|
||||
});
|
||||
};
|
||||
};
|
||||
|
||||
// использование:
|
||||
f = promisify(f, true);
|
||||
f(...).then(arrayOfResults => ..., err => ...)
|
||||
```
|
||||
Reference in New Issue
Block a user