質問

As I understand the current spec for Javascript generators, you have to mark functions containing yields explicitly.

I wonder what the rationate behind this is.

If this is true, it would force people to write:

let thirdfunc = function*() {
  let value = 5;
  let other = yield 6;
  return value;
};

let secondfunc = function*() {
  yield thirdfunc();
};

let firstfunc = function*() {
  yield secondfunc();
};

let gen = function*() {
  // some code
  // more code
  yield firstfunc();
  // and code
};

let it = gen();
while( !it.done() ) {
  it.next();
};

Which means, generators would spread like cancer in a codebase. While in the end, to the developer only yielding and handling the iterator is really interesting.

I would find it much more practical, to just define, where I want to handle the iteration.

let thirdfunc = function() {
  let value = 5;
  let other = yield 6; // Change 1: incorporate yield
  return value;
};

let secondfunc = function() {
  thirdfunc();
};

let firstfunc = function() {
  secondfunc();
};

let gen = function*() { // Change 2: at this level I want to deal with descendant yields
  // some code
  // more code
  firstfunc();
  // and code
};

// Change 3: Handle iterator
let it = gen();
while( !it.done() ) {
  it.next();
}

If the browser then has to turn everything between the yield call and the generator handler (firstfunc, secondfunc, thirdfunc) into promise / future form, that should work automagically and not be the business of Javascript developers.

Or are there really good arguments for not doing this?

役に立ちましたか?

解決

I described the rationale for this aspect of the design at http://calculist.org/blog/2011/12/14/why-coroutines-wont-work-on-the-web/ -- in short, full coroutines (which is what you describe) interfere with the spirit of JavaScript's run-to-completion model, making it harder to predict when your code can be "pre-empted" in a similar sense to multithreaded languages like Java, C#, and C++. The blog post goes into more detail and some other reasons as well.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top