Size: a a a

NodeUA - JavaScript and Node.js in Ukraine

2020 November 15

M

Miseo in NodeUA - JavaScript and Node.js in Ukraine
В двух словах, почему этот код из библиотеки метасинк асинхронный? как это понять? почему он асинхронный? за счет чего?

// Asynchronous map (iterate parallel)
//   items - <Array>, incoming
//   fn - <Function>, to be executed for each value in the array
//     current - <any>, current element being processed in the array
//     callback - <Function>
//       err - <Error> | <null>
//       value - <any>
//   done - <Function>, on done
//     err - <Error> | <null>
//     result - <Array>

const map = (items, fn, done) => {
 const len = items.length;
 if (!len) {
   done(null, []);
   return;
 }
 let errored = false;
 let count = 0;
 const result = new Array(len);

 const next = (index, err, value) => {
   if (errored) return;
   if (err) {
     errored = true;
     done(err);
     return;
   }
   result[index] = value;
   count++;
   if (count === len) done(null, result);
 };

 for (let i = 0; i < len; i++) {
   fn(items[i], next.bind(null, i));
 }

};


https://github.com/metarhia/metasync/blob/master/lib/array.js
источник

IH

Ilya Human in NodeUA - JavaScript and Node.js in Ukraine
Miseo
В двух словах, почему этот код из библиотеки метасинк асинхронный? как это понять? почему он асинхронный? за счет чего?

// Asynchronous map (iterate parallel)
//   items - <Array>, incoming
//   fn - <Function>, to be executed for each value in the array
//     current - <any>, current element being processed in the array
//     callback - <Function>
//       err - <Error> | <null>
//       value - <any>
//   done - <Function>, on done
//     err - <Error> | <null>
//     result - <Array>

const map = (items, fn, done) => {
 const len = items.length;
 if (!len) {
   done(null, []);
   return;
 }
 let errored = false;
 let count = 0;
 const result = new Array(len);

 const next = (index, err, value) => {
   if (errored) return;
   if (err) {
     errored = true;
     done(err);
     return;
   }
   result[index] = value;
   count++;
   if (count === len) done(null, result);
 };

 for (let i = 0; i < len; i++) {
   fn(items[i], next.bind(null, i));
 }

};


https://github.com/metarhia/metasync/blob/master/lib/array.js
Я так понимаю, что за счет самого коллбека fn, то есть мы куда-то прокидываем айтем и этот колбек и может быть асинхронным
источник

M

Miseo in NodeUA - JavaScript and Node.js in Ukraine
вот так она вроде применяется

const dataSet = new Array(10).fill(1);

const bl = (cur, cb) => {
   let smth = cur + 1;
   cb(null, smth);
}

const doneFn = (err, res) => {
   if (err) new Error(err);
   console.log('done', res)
}

map(dataSet, bl, doneFn);
источник

M

Miseo in NodeUA - JavaScript and Node.js in Ukraine
Я просто не понимаю, цикл for он же синхронный. Откуда асинхронность? стек вызовов же забит циклом. И приложение же по идее должно выполнять эту задачу до окончания цикла for
источник

IH

Ilya Human in NodeUA - JavaScript and Node.js in Ukraine
Miseo
Я просто не понимаю, цикл for он же синхронный. Откуда асинхронность? стек вызовов же забит циклом. И приложение же по идее должно выполнять эту задачу до окончания цикла for
Ну, так сам for раскидал колбеки и пошел дальше, а в самих колбеках уже логака обработки респонса и когда количество респонсов === кол-ву айтемов, то тригнется done колбек
источник

IH

Ilya Human in NodeUA - JavaScript and Node.js in Ukraine
Miseo
Я просто не понимаю, цикл for он же синхронный. Откуда асинхронность? стек вызовов же забит циклом. И приложение же по идее должно выполнять эту задачу до окончания цикла for
Насколько я понял, смысл вот в чем
Если юзать простой map с асинками то он сразу вернет тебе промисы и будет сторонне их выполнять
https://prnt.sc/vjily3
А если юзать этот map, То тут мы дожидаемся всех действий и уже с ними делаем что-то дальше в функции done https://prnt.sc/vjiqfn
Но обычный можно юзать с Promise.all и будет типа тоже самое https://prnt.sc/vjitk3
Хз, может автор подскажет
источник

IH

Ilya Human in NodeUA - JavaScript and Node.js in Ukraine
@tshemsedinov Можешь подсказать так или нет ?) Интересно
источник

M

Miseo in NodeUA - JavaScript and Node.js in Ukraine
Ilya Human
Ну, так сам for раскидал колбеки и пошел дальше, а в самих колбеках уже логака обработки респонса и когда количество респонсов === кол-ву айтемов, то тригнется done колбек
То есть правильно ли я понимаю, фор быстро выполнится но заполнит стек функциями, но между функциями будет еще доступно какое то время для других функций и действий?

Просто мне почему то кажется, что так как фор во время выполнения заблокирует выполнение кода, то и стек будет забит выполнение только этих функций. И ничего кроме этого не будет выполнятся. Я конечно могу быть не прав, однако я опираюсь на то что вижу тут: https://www.jsv9000.app у меня получось всё синхронно. Хотя может это песочница такая…
источник

IH

Ilya Human in NodeUA - JavaScript and Node.js in Ukraine
Miseo
То есть правильно ли я понимаю, фор быстро выполнится но заполнит стек функциями, но между функциями будет еще доступно какое то время для других функций и действий?

Просто мне почему то кажется, что так как фор во время выполнения заблокирует выполнение кода, то и стек будет забит выполнение только этих функций. И ничего кроме этого не будет выполнятся. Я конечно могу быть не прав, однако я опираюсь на то что вижу тут: https://www.jsv9000.app у меня получось всё синхронно. Хотя может это песочница такая…
читай про eventloop
источник

DD

Dmytro Drachov in NodeUA - JavaScript and Node.js in Ukraine
Miseo
То есть правильно ли я понимаю, фор быстро выполнится но заполнит стек функциями, но между функциями будет еще доступно какое то время для других функций и действий?

Просто мне почему то кажется, что так как фор во время выполнения заблокирует выполнение кода, то и стек будет забит выполнение только этих функций. И ничего кроме этого не будет выполнятся. Я конечно могу быть не прав, однако я опираюсь на то что вижу тут: https://www.jsv9000.app у меня получось всё синхронно. Хотя может это песочница такая…
Все зависит от того какая у тебя функция fn передается.

Сам map явно синхронный.
Описанный мап конкуренто вызовет твою fn с каждым item.
Next(callback) для того чтобы ты мог сказать что закончил делать то что ты делаешь в fn с item. Как это будет дело твое.

Т.е. если твоя fn синхронная то все будет синхронно.

Обычно в таких либах нарошно не добавляют выполнение твоей fn в следующий цикл лупа, чтобы это мог сделать ты, как нужно будет тебе.

Но я бы не коментил эту штуку как asynchronous map
источник

M

Miseo in NodeUA - JavaScript and Node.js in Ukraine
Dmytro Drachov
Все зависит от того какая у тебя функция fn передается.

Сам map явно синхронный.
Описанный мап конкуренто вызовет твою fn с каждым item.
Next(callback) для того чтобы ты мог сказать что закончил делать то что ты делаешь в fn с item. Как это будет дело твое.

Т.е. если твоя fn синхронная то все будет синхронно.

Обычно в таких либах нарошно не добавляют выполнение твоей fn в следующий цикл лупа, чтобы это мог сделать ты, как нужно будет тебе.

Но я бы не коментил эту штуку как asynchronous map
На каждой итерации я выполняю небольшой расчёт координат для отрисовки свг квадрата. И получается что как ни крути я могу это сделать только синхронно?
источник

DD

Dmytro Drachov in NodeUA - JavaScript and Node.js in Ukraine
Miseo
На каждой итерации я выполняю небольшой расчёт координат для отрисовки свг квадрата. И получается что как ни крути я могу это сделать только синхронно?
Ты можешь сделать это асинхронно, обернув весь небольшой расчет в set immediate или settimeout0 или делать этот расчет в воркере/процессе, через new Promise не советую.

Вообще надо понимать какой длины у тебя массив и что вообще надо делать и надо ли это всё делать конкуренто, может тебе лучше подойдёт что-то типо maplimit.
источник
2020 November 16

M

Miseo in NodeUA - JavaScript and Node.js in Ukraine
Dmytro Drachov
Ты можешь сделать это асинхронно, обернув весь небольшой расчет в set immediate или settimeout0 или делать этот расчет в воркере/процессе, через new Promise не советую.

Вообще надо понимать какой длины у тебя массив и что вообще надо делать и надо ли это всё делать конкуренто, может тебе лучше подойдёт что-то типо maplimit.
в массиве до 1000 объектов. Вычисления не долго делаются. до нескольких секунд. Но хотелось бы ускорить. Да и поток не останавливать. А насчёт сетТаймаута это идея. Сейчас как раз оптимизацией занимаюсь, попробую тесты провести. Думаю свой вклад это внесёт.
источник

LL

Legioner9 Legioner9 in NodeUA - JavaScript and Node.js in Ukraine
затеял базу знаний на md файлах - директория , файлы и ссылки в них + nodejs построитель катлога ее файлов с отображением  ссылок и заголовков в них . наверняка старо как мир - есть советы где уже есть решения ?
источник

KZ

Kostya Zgara in NodeUA - JavaScript and Node.js in Ukraine
источник

LL

Legioner9 Legioner9 in NodeUA - JavaScript and Node.js in Ukraine
спасибо)))
источник
2020 November 17

СБ

Сергей Брыков... in NodeUA - JavaScript and Node.js in Ukraine
ребята, я програмист из Запорожья, сейчас на стажировке в компании - дайте какую нибудь базу с заданиями по NodeJS API по HttpServer
источник

D

Dmytraw in NodeUA - JavaScript and Node.js in Ukraine
Сергей Брыков
ребята, я програмист из Запорожья, сейчас на стажировке в компании - дайте какую нибудь базу с заданиями по NodeJS API по HttpServer
источник

IH

Ilya Human in NodeUA - JavaScript and Node.js in Ukraine
Сергей Брыков
ребята, я програмист из Запорожья, сейчас на стажировке в компании - дайте какую нибудь базу с заданиями по NodeJS API по HttpServer
Тут неплохие статьи https://jscomplete.com/learn/node-beyond-basics
что-то больше чем "создание апи на express"
источник
2020 November 19

M

Miseo in NodeUA - JavaScript and Node.js in Ukraine
Коллеги, предлагаю добавить бота с капчей.
источник