You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
+
Промисификация -- это длинное слово для простой трансформации. Это преобразование функции, которая принимает колбэк в функцию и возвращает промис.
4
4
5
-
In other words, we create a wrapper-function that does the same, internally calling the original one, but returns a promise.
5
+
Другими словами, мы создаём функцию-обёртку, которая делает то же самое, что и функция передаваемая в неё, только в итоге возвращается промис.
6
6
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
+
Такие преобразования часто необходимы в реальной жизни, так как многие функции и библиотеки основаны на колбэках, а использование промисовов более удобно, поэтому есть смысл "промисифицировать" их.
8
8
9
-
For instance, we have `loadScript(src, callback)`from the chapter<info:callbacks>.
9
+
Например, у нас есть `loadScript(src, callback)`из параграфа<info:callbacks>.
10
10
11
11
```js run
12
12
functionloadScript(src, callback) {
@@ -19,11 +19,12 @@ function loadScript(src, callback) {
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) и возвращать промис.
27
28
28
29
```js
29
30
letloadScriptPromise=function(src) {
@@ -35,60 +36,60 @@ let loadScriptPromise = function(src) {
35
36
})
36
37
}
37
38
38
-
//usage:
39
+
//использование:
39
40
// loadScriptPromise('path/script.js').then(...)
40
41
```
41
42
42
-
Now`loadScriptPromise`fits well in our promise-based code.
43
+
Сейчас`loadScriptPromise`хорошо вписывается в наш код, основанный на промисах.
43
44
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`.
45
46
46
-
As we may need to promisify many functions, it makes sense to use a helper.
47
+
Так как нам может понадобиться промисифицировать множество функций, имеет смысл использовать хэлпер.
47
48
48
-
That's actually very simple --`promisify(f)` below takes a to-promisify function `f`and returns a wrapper function.
49
+
На самом деле, это очень просто -`promisify(f)`, описанная ниже, принимает функцию `f`и возвращает функцию-обёртку.
49
50
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`, отслеживая результат в виде специально созданного колбэка:
51
52
52
53
```js
53
54
functionpromisify(f) {
54
-
returnfunction (...args) { //return a wrapper-function
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`отлично работает для такого случая.
77
78
78
-
But what if the original `f`expects a callback with more arguments`callback(err, res1, res2)`?
79
+
Но что, если исходная `f`ожидает колбэк с большим количеством аргументов`callback(err, res1, res2)`?
79
80
80
-
Here's a modification of`promisify` that returns an array of multiple callback results:
81
+
Ниже описана изменённая функция`promisify`, которая возвращает массив результатов:
81
82
82
83
```js
83
-
// promisify(f, true) to get array of results
84
+
// promisify(f, true), чтобы получить массив результатов
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)`, или могут быть встречаться экзотические варианты формата колбэка, которые мы можем промисифицировать самостоятельно.
109
110
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.
111
112
112
113
```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` (см. следующий параграф), но не для замены всех колбэков.
114
115
115
-
Remember, a promise may have only one result, but a callback may technically be called many times.
116
+
Помните, промис может иметь только один результат, но колбэк технически может вызываться сколько угодно раз.
116
117
117
-
So promisification is only meant for functions that call the callback once. Further calls will be ignored.
118
+
Поэтому промисификация используется для функций, которые вызывают колбэк только раз. Остальные вызовы будут проигнорированы.
0 commit comments