Skip to content

Commit cd1f411

Browse files
committed
Translate Promosify topic
1 parent 1c7a55e commit cd1f411

1 file changed

Lines changed: 31 additions & 30 deletions

File tree

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
# Promisification
1+
# Промисификация
22

3-
Promisification -- is a long word for a simple transform. It's conversion of a function that accepts a callback into a function returning a promise.
3+
Промисификация -- это длинное слово для простой трансформации. Это преобразование функции, которая принимает колбэк в функцию и возвращает промис.
44

5-
In other words, we create a wrapper-function that does the same, internally calling the original one, but returns a promise.
5+
Другими словами, мы создаём функцию-обёртку, которая делает то же самое, что и функция передаваемая в неё, только в итоге возвращается промис.
66

7-
Such transforms are often needed in real-life, as many functions and libraries are callback-based. But promises are more convenient. So it makes sense to promisify those.
7+
Такие преобразования часто необходимы в реальной жизни, так как многие функции и библиотеки основаны на колбэках, а использование промисовов более удобно, поэтому есть смысл "промисифицировать" их.
88

9-
For instance, we have `loadScript(src, callback)` from the chapter <info:callbacks>.
9+
Например, у нас есть `loadScript(src, callback)` из параграфа <info:callbacks>.
1010

1111
```js run
1212
function loadScript(src, callback) {
@@ -19,11 +19,12 @@ function loadScript(src, callback) {
1919
document.head.append(script);
2020
}
2121

22-
// usage:
22+
// использование:
2323
// loadScript('path/script.js', (err, script) => {...})
2424
```
2525

2626
Let's promisify it. The new `loadScriptPromise(src)` function will do the same, but accept only `src` (no callback) and return a promise.
27+
Давайте промисифицируем её. Новая функция `loadScriptPromise(src)` будет делать то же самое, но будет принимать только `src` (не callback) и возвращать промис.
2728

2829
```js
2930
let loadScriptPromise = function(src) {
@@ -35,60 +36,60 @@ let loadScriptPromise = function(src) {
3536
})
3637
}
3738

38-
// usage:
39+
// использование:
3940
// loadScriptPromise('path/script.js').then(...)
4041
```
4142

42-
Now `loadScriptPromise` fits well in our promise-based code.
43+
Сейчас `loadScriptPromise` хорошо вписывается в наш код, основанный на промисах.
4344

44-
As we can see, it delegates all the work to the original `loadScript`, providing its own callback that translates to promise `resolve/reject`.
45+
Как видно, она передаёт выполнение всей работы первоначальной функции `loadScript`, предоставляя свой собственный колбэк, который переводится в промис используя `resolve/reject`.
4546

46-
As we may need to promisify many functions, it makes sense to use a helper.
47+
Так как нам может понадобиться промисифицировать множество функций, имеет смысл использовать хэлпер.
4748

48-
That's actually very simple -- `promisify(f)` below takes a to-promisify function `f` and returns a wrapper function.
49+
На самом деле, это очень просто - `promisify(f)`, описанная ниже, принимает функцию `f` и возвращает функцию-обёртку.
4950

50-
That wrapper does the same as in the code above: returns a promise and passes the call to the original `f`, tracking the result in a custom callback:
51+
Эта функция-обёртка делает то же самое, что и код выше: возвращает промис и передаёт вызов оригиналу `f`, отслеживая результат в виде специально созданного колбэка:
5152

5253
```js
5354
function promisify(f) {
54-
return function (...args) { // return a wrapper-function
55+
return function (...args) { // возвращает функцию-обёртку
5556
return new Promise((resolve, reject) => {
56-
function callback(err, result) { // our custom callback for f
57+
function callback(err, result) { // наш специальный колбэк для f
5758
if (err) {
5859
return reject(err);
5960
} else {
6061
resolve(result);
6162
}
6263
}
6364

64-
args.push(callback); // append our custom callback to the end of arguments
65+
args.push(callback); // добавляем колбэк в конце массива аргументов
6566

66-
f.call(this, ...args); // call the original function
67+
f.call(this, ...args); // вызываем оригинальную функцию
6768
});
6869
};
6970
};
7071

71-
// usage:
72+
// использование:
7273
let loadScriptPromise = promisify(loadScript);
7374
loadScriptPromise(...).then(...);
7475
```
7576

76-
Here we assume that the original function expects a callback with two arguments `(err, result)`. That's what we encounter most often. Then our custom callback is in exactly the right format, and `promisify` works great for such a case.
77+
Здесь мы предполагаем, что исходная функция ожидает колбэк с двумя аргументами `(err, result)`. Это то, с чем мы чаще всего сталкиваемся. Следовательно, `callback` объявлен правильно, и `promisify` отлично работает для такого случая.
7778

78-
But what if the original `f` expects a callback with more arguments `callback(err, res1, res2)`?
79+
Но что, если исходная `f` ожидает колбэк с большим количеством аргументов `callback(err, res1, res2)`?
7980

80-
Here's a modification of `promisify` that returns an array of multiple callback results:
81+
Ниже описана изменённая функция `promisify`, которая возвращает массив результатов:
8182

8283
```js
83-
// promisify(f, true) to get array of results
84+
// promisify(f, true), чтобы получить массив результатов
8485
function promisify(f, manyArgs = false) {
8586
return function (...args) {
8687
return new Promise((resolve, reject) => {
87-
function *!*callback(err, ...results*/!*) { // our custom callback for f
88+
function *!*callback(err, ...results*/!*) { // наш специальный колбэк для f
8889
if (err) {
8990
return reject(err);
9091
} else {
91-
// resolve with all callback results if manyArgs is specified
92+
// делаем resolve для всех results колбэка, если задано manyArgs
9293
*!*resolve(manyArgs ? results : results[0]);*/!*
9394
}
9495
}
@@ -100,19 +101,19 @@ function promisify(f, manyArgs = false) {
100101
};
101102
};
102103

103-
// usage:
104+
// использование:
104105
f = promisify(f, true);
105-
f(...).then(arrayOfResults => ..., err => ...)
106+
f(arg1, arg2, ...).then(arrayOfResults => ..., err => ...)
106107
```
107108
108-
In some cases, `err` may be absent at all: `callback(result)`, or there's something exotic in the callback format, then we can promisify such functions manually.
109+
В некоторых случая `err` может отсутствовать: `callback(result)`, или могут быть встречаться экзотические варианты формата колбэка, которые мы можем промисифицировать самостоятельно.
109110
110-
There are also modules with a bit more flexible promisification functions, e.g. [es6-promisify](https://github.com/digitaldesignlabs/es6-promisify). In Node.js, there's a built-in `util.promisify` function for that.
111+
Также существуют модули с более гибкой промисификацией, например, [es6-promisify](https://github.com/digitaldesignlabs/es6-promisify) или встроенная функция `util.promisify` в Node.js.
111112
112113
```smart
113-
Promisification is a great approach, especially when you use `async/await` (see the next chapter), but not a total replacement for callbacks.
114+
Промисификация - это отличный паттерн, особенно, если вы будете использовать `async/await` (см. следующий параграф), но не для замены всех колбэков.
114115

115-
Remember, a promise may have only one result, but a callback may technically be called many times.
116+
Помните, промис может иметь только один результат, но колбэк технически может вызываться сколько угодно раз.
116117

117-
So promisification is only meant for functions that call the callback once. Further calls will be ignored.
118+
Поэтому промисификация используется для функций, которые вызывают колбэк только раз. Остальные вызовы будут проигнорированы.
118119
```

0 commit comments

Comments
 (0)