Skip to content

Commit

Permalink
Merge pull request #43 from JediFE/master
Browse files Browse the repository at this point in the history
Added russian language
  • Loading branch information
bulkan committed May 30, 2016
2 parents d5d2de0 + e7c739c commit 1398fe8
Show file tree
Hide file tree
Showing 10 changed files with 307 additions and 1 deletion.
2 changes: 1 addition & 1 deletion async_you.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@ const workshopper = require('workshopper')
workshopper({
name: "async-you",
appDir: __dirname,
languages: ['en', 'fr'],
languages: ['en', 'fr', 'ru'],
helpFile: path.join(__dirname, "./i18n/help/{lang}.txt")
});
38 changes: 38 additions & 0 deletions exercises/each/problem.ru.md
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` на любые ошибки.
45 changes: 45 additions & 0 deletions exercises/map/problem.ru.md
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` для результата.
17 changes: 17 additions & 0 deletions exercises/reduce/problem.ru.md
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
57 changes: 57 additions & 0 deletions exercises/series_object/problem.ru.md
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` для вывода результатов, когда все функции выполнятся.
35 changes: 35 additions & 0 deletions exercises/times/problem.ru.md
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
74 changes: 74 additions & 0 deletions exercises/waterfall/problem.ru.md
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`, чтобы вывести тело ответа.
15 changes: 15 additions & 0 deletions exercises/whilst/problem.ru.md
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
12 changes: 12 additions & 0 deletions i18n/help/ru.txt
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/
Не стесьняйтесь отправить отчет об ошибке или (предпочтительно) пулл-реквест.
13 changes: 13 additions & 0 deletions i18n/ru.json
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"
}
}

0 comments on commit 1398fe8

Please sign in to comment.