-
Notifications
You must be signed in to change notification settings - Fork 39
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #43 from JediFE/master
Added russian language
- Loading branch information
Showing
10 changed files
with
307 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
Время от времени вы бы хотели вызывать одну и ту же функцию несколько раз, но | ||
с разными параметрами, **не беспокоясь о том, какие данные возвращаются**, но | ||
проверяя, если вызовы выдают ошибки. | ||
|
||
В данном случае будет полезен `async.each`. | ||
|
||
Например, следующий код будет делать три вызова и использовать значения в массиве: | ||
|
||
```js | ||
var http = require('http') | ||
, async = require('async'); | ||
async.each(['cat', 'meerkat', 'penguin'], function(item, done){ | ||
var opts = { | ||
hostname: 'http://httpbin.org', | ||
path: '/post', | ||
method: 'POST' | ||
}; | ||
var req = http.request(opts, function(res){ | ||
res.on('data', function(chunk){ | ||
}); | ||
res.on('end', function(){ | ||
return done(); | ||
}); | ||
}); | ||
req.write(item); | ||
req.end(); | ||
}, | ||
function(err){ | ||
if (err) console.log(err); | ||
}); | ||
``` | ||
|
||
## Задача | ||
|
||
Создать программу, которая получает два URL, как первый и второй аргументы командной строки. | ||
|
||
Затем, используя `http.get`, чтобы сделать два GET запроса, по одному на каждый URL, | ||
и `console.log` на любые ошибки. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
С `async.each`, результаты асинхронной функции будут **потеряны**. | ||
|
||
На помощь приходит `async.map`. Он делает то же самое, что и `async.each`, | ||
путем вызова асинхронной функции итератора на массив, но **собирает результаты** | ||
асинхронной функции итератора и передает результат в функцию обратного вызова. | ||
|
||
Результаты представлены в виде массива, которые находятся **в том же порядке**, | ||
что и в исходном массиве. | ||
|
||
Пример в EACH-задаче можно записать в виде: | ||
|
||
```js | ||
var http = require('http') | ||
, async = require('async'); | ||
async.map(['cat', 'meerkat', 'penguin'], function(item, done){ | ||
var opts = { | ||
hostname: 'http://httpbin.org', | ||
path: '/post', | ||
method: 'POST' | ||
}; | ||
var body = ''; | ||
var req = http.request(opts, function(res){ | ||
res.on('data', function(chunk){ | ||
body += chunk.toString(); | ||
}); | ||
res.on('end', function(){ | ||
return done(null, body); | ||
}); | ||
}); | ||
req.write(item); | ||
req.end(); | ||
}, | ||
function(err, results){ | ||
if (err) return console.log(err); | ||
// Результаты - это массив тел ответов в том же порядке. | ||
}); | ||
``` | ||
|
||
## Задача | ||
|
||
Напишите программу, которая будет принимать два аргумента командной строки для двух URL. | ||
|
||
Используйте `http.get`, чтобы создать два GET-запроса по этим URL. | ||
|
||
Вам нужно будет использовать `async.map`, затем используйте `console.log` для результата. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
## Challenge | ||
Напишите программу, которая будет получать URL в качестве первого аргумента командной строки. | ||
|
||
Для каждого из значений в следующем массиве, отправьте GET-запрос на URL, | ||
используя `http.get` с параметром запроса `number`, устанавливая в нужное значение: | ||
|
||
```js | ||
['one', 'two', 'three'] | ||
``` | ||
Каждый раз конвертируйте тело ответа в `Number` и добавляйте его к предыдущему значению. | ||
`console.log` для вывода финального результата. | ||
|
||
## Советы | ||
|
||
Используйте `async.reduce`: | ||
|
||
https://github.com/caolan/async#reduce |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
В этой задаче мы изучим с Вами, как использовать `async.series`. | ||
|
||
Главное отличие между функциями `waterfall` и `series` является то, что результат функции | ||
в `async.series` **не будет передаваться** к следующей функции после ее выполнения. | ||
`series` будет **собирать все результаты в виде массива** и передавать их | ||
**в опциональную функцию обратного вызова**, которая отработает **один раз, | ||
как только все функции выполнятся**. | ||
Например: | ||
|
||
```js | ||
async.series([ | ||
function(callback){ | ||
setTimeout(function() { | ||
callback(null, 'one'); | ||
}, 200); | ||
}, | ||
function(callback){ | ||
setTimeout(function() { | ||
callback(null, 'two'); | ||
}, 100); | ||
} | ||
], | ||
// Опциональная функция обратного вызова. | ||
function(err, results){ | ||
// Результат теперь будет равен ['one', 'two'] | ||
}); | ||
``` | ||
Вместо использования массива, как контейнера для результата `async.series` может | ||
использовать объект, запуская каждое свойство и создавая объект в качестве | ||
результата с теми же свойствами. Пример выше может быть переписал как: | ||
|
||
```js | ||
async.series({ | ||
one: function(done){ | ||
done(null, '1'); | ||
}, | ||
two: function(done){ | ||
done(null, '2'); | ||
} | ||
}, function(err, results){ | ||
console.log(results); | ||
// Результатом будет {one: 1, two: 2} | ||
}); | ||
``` | ||
|
||
## Задание | ||
|
||
Напишите программу, которая принимает два URL, как первый и второй аргумент | ||
командной строки. | ||
|
||
Используя `http.get`, создайте GET запрос на эти URL и передайте тело ответа в | ||
функцию обратного вызова. | ||
|
||
Передайте в функцию `async.series` объект, используя свойства `requestOne` и | ||
`requestTwo`. | ||
|
||
Используйте `console.log` для вывода результатов, когда все функции выполнятся. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
# Задача | ||
|
||
Напишите программу, которая будет принимать два аргумента в командной строке, | ||
содержащие хост и порт. Используйте `http.request` и отправте POST-запрос на | ||
|
||
```js | ||
url + '/users/create' | ||
``` | ||
с телом, содержащим `JSON.stringify` объект: | ||
|
||
```js | ||
{"user_id": 1} | ||
``` | ||
|
||
Сделайте это в пять раз и каждый раз увеличивайте свойство `user_id`, начиная с 1. | ||
|
||
Когда запросы будут завершены, отправьте GET-запрос на: | ||
|
||
```js | ||
url + '/users' | ||
``` | ||
|
||
используйте `console.log` на тело ответа от GET-запроса. | ||
|
||
## Советы | ||
|
||
В этой задаче, вам необходимо будет координировать несколько асинхронное операций. | ||
|
||
Используйте `async.series` для этого и передать в` Object`. В одной из функций | ||
нужно использовать `async.times`, чтобы отправить POST-request используя `http.request`. | ||
Другая будет делать GET-запрос. | ||
|
||
Вы можете прочитать больше о функции `async.times` здесь: | ||
|
||
https://github.com/caolan/async#times |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
В Node.js и браузерах есть 3 способа реализовать **асинхронный** JavaScript. | ||
|
||
Первый путь приводит к тому, что мы называем **Callback Hell**. | ||
Callback Hell можно свести к минимуму, следуя следующим советам: | ||
http://callbackhell.com. | ||
|
||
Другой метод заключается в использовании пакета `Promise`. Используя `Promise` | ||
можно упростить код, но он также добавляет еще один уровень абстракции. | ||
|
||
Последний метод заключается в использовании пакета `async`, созданного Caolan McMahon. | ||
Благодаря **async** мы все еще пишем функции обратного вызова, но без использования | ||
Callback Hell или добавления другого уровня абстракции от Promise. | ||
|
||
Чаще всего вам нужно будет сделать несколько асинхронных вызовов один за другим и | ||
каждый вызов будет в зависимости от результата предыдущего асинхронного вызова. | ||
Мы можем сделать это с помощью `async.waterfall`. | ||
|
||
Для примера рассмотрим следующий код: | ||
|
||
1) Делаем запрос GET на `http://localhost:3131` в функции waterfall. | ||
2) Тело ответ передается в качестве аргумента к следующей функции waterfall через | ||
обратный вызов. Вторая функция в waterfall принимает тело как | ||
параметр и использует `JSON.parse`, чтобы получить свойство `port`, | ||
чтобы сделать другой GET запрос. | ||
|
||
```js | ||
var http = require('http') | ||
, async = require('async'); | ||
|
||
async.waterfall([ | ||
function(cb){ | ||
var body = ''; | ||
// ответ - это закодируемый JSON-объект, как следующий пример {порт: 3132} | ||
http.get("http://localhost:3131", function(res){ | ||
res.on('data', function(chunk){ | ||
body += chunk.toString(); | ||
}); | ||
res.on('end', function(){ | ||
cb(null, body); | ||
}); | ||
}).on('error', function(err) { | ||
cb(err); | ||
}); | ||
}, | ||
|
||
function(body, cb){ | ||
var port = JSON.parse(body).port; | ||
var body = ''; | ||
http.get("http://localhost:" + port, function(res){ | ||
res.on('data', function(chunk){ | ||
body += chunk.toString(); | ||
}); | ||
res.on('end', function(){ | ||
cb(null, body); | ||
}); | ||
}).on('error', function(err) { | ||
cb(err); | ||
}); | ||
} | ||
], function(err, result){ | ||
if (err) return console.error(err); | ||
console.log(result); | ||
}); | ||
``` | ||
|
||
## Задание | ||
|
||
В этой задаче вам нужно написать программу, которая будет считывать содержимое файла. | ||
|
||
Путь к файлу будет передан, как первый аргумент в командной строке | ||
(т.е `process.argv[2]`). | ||
|
||
Файл будет содержать один URL. Используйте `http.get`, чтобы сделать GET запрос на | ||
этот URL и напишите `console.log`, чтобы вывести тело ответа. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
## Задача | ||
|
||
Напишите программу, которая будет принимать один аргумент командной строки к URL-адресу. | ||
|
||
Используйте `async.whilst` и `http.get`, отправьте GET-запросы на этот URL пока не получите | ||
тело ответа содержащее строку `"meerkat"`. | ||
|
||
`сonsole.log` количества GET-запросов, необходимых для получения "meerkat" строки. | ||
|
||
## Советы | ||
|
||
`String.prototype.trim()` - это ваш друг. | ||
Узнайте больше о `async.whilst()` здесь: | ||
|
||
https://github.com/caolan/async#whilst |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
{yellow}{bold}Есть проблемы с приложением {appname}?{/bold}{/yellow} | ||
|
||
Если ты ищешь помощь с Node.js, канал #Node.js | ||
на Freenode IRC - это отличное место для поиска желающих помочь. | ||
Здесь также есть Node.js Google Group: | ||
https://groups.google.com/forum/#!forum/nodejs | ||
|
||
{yellow}{bold}Нашел баг в приложении {appname} или просто хочешь помочь в развитии проекта?{/bold}{/yellow} | ||
|
||
Официальный репозиторий для приложения {appname}: | ||
https://github.com/bulkan/async-you/ | ||
Не стесьняйтесь отправить отчет об ошибке или (предпочтительно) пулл-реквест. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
{ | ||
"title": "async you - изучите как использовать пакет async", | ||
"subtitle": "\u001b[23mВыберите упражнение и нажмите клавишу \u001b[3mEnter\u001b[23m для начала", | ||
"exercise": { | ||
"WATERFALL": "waterfall", | ||
"SERIES OBJECT": "series object", | ||
"EACH": "each", | ||
"MAP": "map", | ||
"TIMES": "times", | ||
"REDUCE": "reduce", | ||
"WHILST": "whilst" | ||
} | ||
} |