Рассмотрим этот фрагмент кода:
function foo(a) {
console.log("Mul =", a);
return a * 2;
};
function * process(start) {
// next() #1
var result = start;
console.log("Pre-processing =", result);
result = yield foo(result);
// next() #2
console.log("Process result 1 =", result);
result = yield foo(result);
// next() #3
console.log("Process result 2 =", result);
result = yield foo(result);
// next() #4
console.log("Process result 3 =", result);
return foo(result);
}
var it = process(1);
console.log("#1");
console.log("Next 1 =", /*#1*/it.next("bar"));
console.log("#2");
console.log("Next 2 =", /*#2*/it.next(3));
console.log("#3");
console.log("Next 3 =", /*#3*/it.next(7));
console.log("#4");
console.log("Next 4 =", /*#4*/it.next(15));
И вывод
#1
Pre-processing = 1
Mul = 1
Next 1 = { value: 2, done: false }
#2
Process result 1 = 3
Mul = 3
Next 2 = { value: 6, done: false }
#3
Process result 2 = 7
Mul = 7
Next 3 = { value: 14, done: false }
#4
Process result 3 = 15
Mul = 15
Next 4 = { value: 30, done: true }
Почему первый вызов it.next()
пропускает аргументы (в приведенном выше коде "bar"
) вообще? Или, другими словами, почему при последующих вызовах поведение отличается? Я ожидал, что вызов функции генератора пропустит аргументы, и что вызов next()
фактически инициализирует итератор, делая процесс более последовательным, не так ли?
next
, похоже, принимает во внимание только первый переданный аргумент. По этой причине аргументы итератора будут переданы генератору. В результате нет возможности получить необязательный аргумент первогоnext
. Хотя это все догадки. - person Loamhoof   schedule 08.01.2014var [a, b] = yield c;
получит аргументы отit.next(1, 2);
. - person Yanick Rochon   schedule 08.01.2014next
, вам нужно какое-то место для их получения (нет предыдущегоyield
для их возврата), или они должны быть приведены в аргументы генератора. Дело в том, что это было бы нелогично, потому чтоnext
обрабатывает только 1 аргумент atm. Но на самом деле это может измениться. - person Loamhoof   schedule 08.01.2014function *
. Javascript является расширенным набором ECMAScript, и когда ECMAScript играет в догонялки, требуется дифференциация. - person Evan Carroll   schedule 22.01.2014