These are chat archives for NodejsRUS/chat

7th
Jul 2015
Orel
@2byte
Jul 07 2015 07:41
Никто не работал с https://github.com/caolan/async ?
Alexey Khristov
@AlexeyKhristov
Jul 07 2015 08:18
@2byte я работал. задавай вопрос
Orel
@2byte
Jul 07 2015 08:20

@AlexeyKhristov я что-то не вкурю как оно работает

async.parallel([
    function(){ ... },
    function(){ ... }
], callback);

Колбэки должны выполнятся параллельно и асинхронно?

Alexey Khristov
@AlexeyKhristov
Jul 07 2015 08:33
да. А финальный колбек вызовется когда в каждой из функций ты дернешь свой callback
Orel
@2byte
Jul 07 2015 08:34
@AlexeyKhristov Когда все функции завершатся то-есть
Alexey Khristov
@AlexeyKhristov
Jul 07 2015 08:34
нет, в этом и фокус
смотри в каждой из функций есть свой callback
и его нужно вызвать
на примере из офф документации проще объяснить, сек
Orel
@2byte
Jul 07 2015 08:37
@AlexeyKhristov ну я примерно понял
Alexey Khristov
@AlexeyKhristov
Jul 07 2015 08:37
async.parallel([
    function parallelFunction1(callback){
    },
    function parallelFunction1(callback){
    }
],
function finalCallback(err, results){
});

смотри в каждой из parallelFunctionN есть первый параметр - callback
внутри функции ты делаешь любые асинхронные действия, напрмиер запрос к БД,
а когда закончил - вызываешь callback

таким образом async и понимает что функция выполнена

Orel
@2byte
Jul 07 2015 08:39
@AlexeyKhristov А если функция в параллели не может соединится с бд 100 часов, а кэлбэк без этого не вызовится ?
Alexey Khristov
@AlexeyKhristov
Jul 07 2015 08:41
значит твой finalCallback никогда не вызовется
такого рода задачу можно решить по другому
Orel
@2byte
Jul 07 2015 08:42
@AlexeyKhristov А остановить можно все мои задачи ?
@AlexeyKhristov Ну таймаут поставить
Alexey Khristov
@AlexeyKhristov
Jul 07 2015 08:42
остановить тоже нет, если ты уже запустил - то не остановить
да, таймаут и через lodash once
если хочешь останавливать - то тебе нужна комбинация из parallel и series
Orel
@2byte
Jul 07 2015 08:43
@AlexeyKhristov lodash once это что?
Alexey Khristov
@AlexeyKhristov
Jul 07 2015 08:43
функция обертка, колбек вызовется толко один раз
на случай если ты вызовешь коллбек по таймауту, а потом и база данных ответит
Orel
@2byte
Jul 07 2015 08:46
@AlexeyKhristov а остановить асинс нельзя?
@2byte будет 1000 задач, которые надо будет выполнить по 20 штук, где-то зависнет и все
Alexey Khristov
@AlexeyKhristov
Jul 07 2015 08:48
async всего лишь запускает функции в опеределенном порядке, если функция вызвана - то ты уже ничего не сделаешь.
это уже на уровне функции, которую ты вызываешь
и в ней же тебе и прийдется конролировать зависания
ты можешь попробовать воспользоваться другими обертками от async - например retry
но я готов поспорить от этого код чище и понятнее не станет
Orel
@2byte
Jul 07 2015 08:52
@AlexeyKhristov а как же тогда освобождать ресурсы
@AlexeyKhristov если по таймеру открывается по 1к задач, ресурсы постепенно закончатся
Alexey Khristov
@AlexeyKhristov
Jul 07 2015 08:54
запускай через parallelLimit по 20 штук, как ты и хотел
и внутри функции через setTimeout и _.once вызывай callback и чисти ресурсы
Orel
@2byte
Jul 07 2015 08:56
@AlexeyKhristov уничтожая переменные ?
Alexey Khristov
@AlexeyKhristov
Jul 07 2015 08:58

краткий пример

async.parallelLimit([
    function parallelFunction1(cb){
        var callback = _.once(cb);

       asyncJobRunner(callback);

        setTimeout(function() {
           // clean all data
           callback();
        });
    },
 ...
], function finalCallback(err, results){});

в коллбеке таймаута можешь почистить все что нужно

таймаут должен быть там где есть доступ к ресурсам, которые ты создаешь и хочешь уничтожить
Orel
@2byte
Jul 07 2015 12:06
@AlexeyKhristov вставлю 1000, по 20 исполнятся будет?
Orel
@2byte
Jul 07 2015 13:20
forEach блокирующий цикл ?
Alexey Khristov
@AlexeyKhristov
Jul 07 2015 13:44

@AlexeyKhristov вставлю 1000, по 20 исполнятся будет?

если parallelLimit - тогда да

forEach блокирующий цикл ?

если ты про array. forEach - до тех пор пока в коллбеке только синхронные операции - да. асинхронные операции он ждать не будет.
если ты про async.each / eachLimit - это тоже самое что и async.parallel только синтаксис отличается. вместо массива функций одна функция итератор, применяемая к каждому элементу

Orel
@2byte
Jul 07 2015 13:48
@AlexeyKhristov обычные циклы типа for,while, тоже асинхронно запустят функции? И в асинхронных запущенных функциях, циклы не блокируют ?
Андрей Листочкин (Andrey Listochkin)
@listochkin
Jul 07 2015 14:51
@2byte да, простые циклы for, for .. in, for .. of, while, тоже запустят колбеки асинхронно
Orel
@2byte
Jul 07 2015 14:51
@listochkin а в асинхронном колбеке, блокирующая функция заставит блокироваться все приложение?
Андрей Листочкин (Andrey Listochkin)
@listochkin
Jul 07 2015 14:52
типа readFileSync? да
Orel
@2byte
Jul 07 2015 14:52
@listochkin Да
Андрей Листочкин (Andrey Listochkin)
@listochkin
Jul 07 2015 14:52
заблокирует все
поэтому их и не рекомендуют
Orel
@2byte
Jul 07 2015 14:53
@listochkin а все стандартные функции, условия if, switch блокировать не будут?
Андрей Листочкин (Andrey Listochkin)
@listochkin
Jul 07 2015 14:54
все будут блокировать
Orel
@2byte
Jul 07 2015 14:54
@listochkin а как быть?
Андрей Листочкин (Andrey Listochkin)
@listochkin
Jul 07 2015 14:54
у тебя один поток JS в Ноде, поэтому если ты из JS используешь блокирующие функции, то они его просто стопают
а в чем проблема всегда асинхронные вызовы использовать?
Orel
@2byte
Jul 07 2015 14:55
@listochkin if в асинхронной функции заблокирует, получается так
Андрей Листочкин (Andrey Listochkin)
@listochkin
Jul 07 2015 14:55
нет
блокируют синхронные
на jQuery программировал раньше?
Orel
@2byte
Jul 07 2015 14:56
@listochkin ну, то что синхронные это понятно
@listochkin да
@listochkin есть что-то общее для понимания между клиентским js?
Андрей Листочкин (Andrey Listochkin)
@listochkin
Jul 07 2015 14:58
класс. самое простое объяснение - везде, когда с базой общаешься, HTTP-запросы делаешь или файлы читаешь/пишешь, то представляй, будто делаешь
$.getJSON(someOptions, function callback (data) {
  … 
})
как будто это у тебя просто код на страничке браузера. И страничка одна
Orel
@2byte
Jul 07 2015 15:00
@listochkin я юзаю JSON.parse()