tl; д-р вам нужно обернуть IIFE скобками или вообще не использовать IIFE.
Использование генераторов в порядке, и один разВы добавляете парены, все работает как обычно.
Обратите внимание, что вам не нужно IIFE для запуска кода, но мой ответ ниже объясняет, почему то, что у вас не работает.
Объявления функций и выражения функций
Основная проблема, с которой вы столкнулись, заключается в следующем коде:
function() {
var gen = sogen();
gen.next(so);
gen.next(so);
}()
Это приведет к ошибке, аналогичной:
Uncaught SyntaxError: Неожиданный токен (
Проблема здесь в том, что вы пытаетесь использовать объявление функции в качестве выражения функции .
Из MDN (выделено мной):
Выражение функции очень похоже и имеет почти такой же синтаксис, что и оператор функции (подробности см. В операторе функции). Основное отличие междуВыражение функции и оператор функции является фуnction name, которое может быть опущено в выражениях функций для создания анонимных функций. Выражение функции может использоваться как IIFE (выражение вызова с немедленным вызовом), которое запускается, как только оно определено .См. Также главу о функциях для получения дополнительной информации.
Это означает, что для немедленного выполнения функции вам необходимо использовать функцию выражение вместо оператора .
Один из распространенных способов написания выражения функции - заключить функцию в скобки:
function a() { return 'a'; } // Function declaration
(function b() { return 'b'; }) // Function expression
Чтобы преобразовать это в IIFE, вы можете добавить вызов ()
в конце:
(function c() { return 'c'; })() // IIFE
, который немедленно вызывает функцию.Обратите внимание, что я предпочитаю ставить скобки вызова внутри переносящих скобок, но это просто стилистический выбор и работает таким же образом:
(function c() { return 'c'; }()) // IIFE
Вот код из ответа плюс скобки, заключающие IIFE:
function so() {
console.log('inside the timer');
}
function* sogen() {
const callback = yield;
setTimeout(callback, 2000);
return 1;
}
(function() {
const gen = sogen();
gen.next(so);
gen.next(so);
}())
Либо просто удалите IIFE:
const gen = sogen();
gen.next(so);
gen.next(so);
или, если вам нужно объявление функции, вызовите функцию в следующей строке:
function run() {
const gen = sogen();
gen.next(so);
gen.next(so);
}
run();