Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / HTML, JavaScript, VBScript, CSS Новый топик    Ответить
 JavaScript генераторы. Вопрос.  [new]
sergnn
Member

Откуда: Нижний Новгород
Сообщений: 342
Подскажите где ошибаюсь
пишу (использую библиотеку co())

var f1 = function () {}	
var f2 = function () {}	
var f3 = function () {}	

function* generator () {
   yield f1();
   yield f2();
   yield f3();
};

co(generator);


исполняется только f1()

OK? тогда так, без co()

	let generator = generateSequence();
	generator.next();
	generator.next();
	generator.next();


эффект тот же.
Я понимаю, что я что-то не понимаю. Но не понимаю что именно.
8 фев 19, 11:50    [21804183]     Ответить | Цитировать Сообщить модератору
 Re: JavaScript генераторы. Вопрос.  [new]
Лысый дядька
Member

Откуда:
Сообщений: 356
Картинка с другого сайта.
8 фев 19, 16:49    [21804636]     Ответить | Цитировать Сообщить модератору
 Re: JavaScript генераторы. Вопрос.  [new]
hVostt
Member

Откуда:
Сообщений: 15624
Лысый дядька,

кто-то ещё на саблимке сидит )
8 фев 19, 21:56    [21804932]     Ответить | Цитировать Сообщить модератору
 Re: JavaScript генераторы. Вопрос.  [new]
Лысый дядька
Member

Откуда:
Сообщений: 356
hVostt
Лысый дядька,

кто-то ещё на саблимке сидит )

Неа, не сижу. :) Просто дома не работаю принципиально и поэтому установленных IDE под рукой нет, а сижу (и плотно) на линейке продуктов от JetBrains, куплен весь пакет тащемта.
8 фев 19, 22:12    [21804940]     Ответить | Цитировать Сообщить модератору
 Re: JavaScript генераторы. Вопрос.  [new]
hVostt
Member

Откуда:
Сообщений: 15624
Лысый дядька
а сижу (и плотно) на линейке продуктов от JetBrains, куплен весь пакет тащемта


лойс :)
аналогично Картинка с другого сайта.
8 фев 19, 23:18    [21804982]     Ответить | Цитировать Сообщить модератору
 Re: JavaScript генераторы. Вопрос.  [new]
sergnn
Member

Откуда: Нижний Новгород
Сообщений: 342
Лысый дядька,
Спасибо, нашёл ошибку.
Но библиотека co() всё равно почему то неправильно работает. Может не там взял?
Вызывает только первую функцию. А при вызове последовательно методами next() всё нормально.
11 фев 19, 09:51    [21806088]     Ответить | Цитировать Сообщить модератору
 Re: JavaScript генераторы. Вопрос.  [new]
Лысый дядька
Member

Откуда:
Сообщений: 356
sergnn
Но библиотека co() всё равно почему то неправильно работает.

А что вообще вы хотите добиться? Я не увидет какого-то профита от использования этой тулзы, наоборот, она только запутывает и усложняет.
11 фев 19, 10:24    [21806123]     Ответить | Цитировать Сообщить модератору
 Re: JavaScript генераторы. Вопрос.  [new]
sergnn
Member

Откуда: Нижний Новгород
Сообщений: 342
Лысый дядька,

Есть блок в программе, где несколько действий должны выполняться последовательно (синхронно).
Но количество действий должно в последствии увеличиваться.
co() вроде как сама должна высчитать число вызовов метода next()
А так надо не забыть в случае дополнения добавить ещё вызов next().
Если забыть, то потом ошибку искать утомительно будет.
Тем более, что блок дописывать буду не только я.
11 фев 19, 11:41    [21806197]     Ответить | Цитировать Сообщить модератору
 Re: JavaScript генераторы. Вопрос.  [new]
Лысый дядька
Member

Откуда:
Сообщений: 356
sergnn
Лысый дядька,

Есть блок в программе, где несколько действий должны выполняться последовательно (синхронно).
Но количество действий должно в последствии увеличиваться.
co() вроде как сама должна высчитать число вызовов метода next()
А так надо не забыть в случае дополнения добавить ещё вызов next().
Если забыть, то потом ошибку искать утомительно будет.
Тем более, что блок дописывать буду не только я.


Честно говоря, не понял ничего. Каким образом co может вычислить количество вызовов метода next? Это в неё надо как-то передать? И чем это отличается от простого цикла со счетчиком?
11 фев 19, 11:48    [21806207]     Ответить | Цитировать Сообщить модератору
 Re: JavaScript генераторы. Вопрос.  [new]
sergnn
Member

Откуда: Нижний Новгород
Сообщений: 342
Лысый дядька,

описание работы с co() взято отсюда:
https://habr.com/ru/company/piter/blog/434360/

Может я что-то неправильно понял.
Не могу себя назвать крутым знатоком скрипта.
Основная моя стезя Java + SQL
11 фев 19, 13:05    [21806301]     Ответить | Цитировать Сообщить модератору
 Re: JavaScript генераторы. Вопрос.  [new]
Лысый дядька
Member

Откуда:
Сообщений: 356
sergnn
Лысый дядька,

описание работы с co() взято отсюда:
https://habr.com/ru/company/piter/blog/434360/

Может я что-то неправильно понял.
Не могу себя назвать крутым знатоком скрипта.
Основная моя стезя Java + SQL


Вы как-нибудь иначе сформируйте свою задачу. Она наверняка решается элементарно.
11 фев 19, 13:29    [21806339]     Ответить | Цитировать Сообщить модератору
 Re: JavaScript генераторы. Вопрос.  [new]
sergnn
Member

Откуда: Нижний Новгород
Сообщений: 342
Лысый дядька,

Ок.
Есть несколько функций, которые должны выполнятся последовательно.
Ибо выполнять или не выполнять следующую зависит от результата исполнения предыдущей.
А в функциях есть длительные операции вроде запроса данных с сервера или получения электронной подписи на клиенте.
Понятно, что это решается с помощью обратных вызовов, но если этих функций более нескольких штук,
то код становится просто жутко не читаемым. Тем более если нужно добавить ещё одно действие,
то вставлять дополнительный уровень обратных вызовов получается слишком уж коряво.
Вот с помощью генераторов это в принципе решается, но есть маленькая проблем описанная выше.
то есть при добавлении новой функции нужно не забыть добавить вызов метода генератора next().
Собственно не проблема, но хочется поэлегантнее.
11 фев 19, 14:15    [21806418]     Ответить | Цитировать Сообщить модератору
 Re: JavaScript генераторы. Вопрос.  [new]
Лысый дядька
Member

Откуда:
Сообщений: 356
sergnn
Ок.
Есть несколько функций, которые должны выполнятся последовательно.
Ибо выполнять или не выполнять следующую зависит от результата исполнения предыдущей.
А в функциях есть длительные операции вроде запроса данных с сервера или получения электронной подписи на клиенте.
Понятно, что это решается с помощью обратных вызовов, но если этих функций более нескольких штук,
то код становится просто жутко не читаемым. Тем более если нужно добавить ещё одно действие,
то вставлять дополнительный уровень обратных вызовов получается слишком уж коряво.
Вот с помощью генераторов это в принципе решается, но есть маленькая проблем описанная выше.
то есть при добавлении новой функции нужно не забыть добавить вызов метода генератора next().
Собственно не проблема, но хочется поэлегантнее.


Ух!!!! Дык промисы же для этого самого и придуманы! Вы про генераторы знаете, а про промисы нет? Гуглите "ES6 Promise"
11 фев 19, 14:46    [21806463]     Ответить | Цитировать Сообщить модератору
 Re: JavaScript генераторы. Вопрос.  [new]
sergnn
Member

Откуда: Нижний Новгород
Сообщений: 342
Лысый дядька,
Дык ведь генераторы по сути промисы и возвращают.
По идее это развитие промисов.
11 фев 19, 16:10    [21806586]     Ответить | Цитировать Сообщить модератору
 Re: JavaScript генераторы. Вопрос.  [new]
Лысый дядька
Member

Откуда:
Сообщений: 356
sergnn
Лысый дядька,
Дык ведь генераторы по сути промисы и возвращают.
По идее это развитие промисов.

В вашей задаче вы боитесь (и справедливо) ада коллбэков. Промисы решают этот вопрос цепочкой then-вызовов, при чем тут генераторы? Вы хотите последовательно вызвать несколько асинхронных функций, одна после завершения другой, это делается вот так
firstThingAsync()  
  .then(function(result1) {
      return new Promise((resolve, reject) => {
          $.getJSON(url)
         .done((json) => resolve(json))
         .fail((xhr, status, err) => reject(status + err.message));
  });
  })
  .then(function(results) {
      return new Promise((resolve, reject) => {
          $.getJSON(url2)
          .done((json) => resolve(json))
         .fail((xhr, status, err) => reject(status + err.message));
  });
  })
    return new Promise((resolve, reject) => {
    $.getJSON(url3)
      .done((json) => resolve(json))
      .fail((xhr, status, err) => reject(status + err.message));
  });
  .catch(function(err){ /* ... */ });
11 фев 19, 16:27    [21806612]     Ответить | Цитировать Сообщить модератору
 Re: JavaScript генераторы. Вопрос.  [new]
sergnn
Member

Откуда: Нижний Новгород
Сообщений: 342
Лысый дядька,

Спасибо, посмотрю.
11 фев 19, 17:26    [21806693]     Ответить | Цитировать Сообщить модератору
 Re: JavaScript генераторы. Вопрос.  [new]
sergnn
Member

Откуда: Нижний Новгород
Сообщений: 342
Лысый дядька,

И всё таки с генераторами код мне кажется более читаемым.
Хотя конечно дело вкуса и привычки.
13 фев 19, 09:58    [21808080]     Ответить | Цитировать Сообщить модератору
 Re: JavaScript генераторы. Вопрос.  [new]
Лысый дядька
Member

Откуда:
Сообщений: 356
sergnn
И всё таки с генераторами код мне кажется более читаемым.
Хотя конечно дело вкуса и привычки.

Читаемый код получается с async/await
13 фев 19, 11:56    [21808237]     Ответить | Цитировать Сообщить модератору
 Re: JavaScript генераторы. Вопрос.  [new]
sergnn
Member

Откуда: Нижний Новгород
Сообщений: 342
Лысый дядька,
использование библиотеки со()
приводит вариант с генераторами почти к виду async/await
только вот почему то не работает зараза.

Кстати для использования async/await нужно тоже доп. библиотеку грузить?
15 фев 19, 11:59    [21810429]     Ответить | Цитировать Сообщить модератору
 Re: JavaScript генераторы. Вопрос.  [new]
Vladimir A
Member

Откуда: toronto
Сообщений: 86
sergnn,
have a look saga
15 фев 19, 19:07    [21811130]     Ответить | Цитировать Сообщить модератору
Все форумы / HTML, JavaScript, VBScript, CSS Ответить