2016-04-30 12 views
4
function* generatorFunction() { 
    yield (yield 1)(yield 2)(yield 3)(); 
} 
var iterator = generatorFunction(); 

// [1, 2, 3] 
var iteratedOver = [iterator.next().value, iterator.next().value, iterator.next().value]; 

これはどのように作用するのかよくわからない。ES6収率(収率1)(収率2)(収率3)(

yieldは機能参照を返しません。したがって、(yield 2)のようなかっこのステートメントは何ですか - 体のない太った矢印の匿名機能ですか?そのような部分的なアプリケーションを使ってどのように呼び出されますか?

私はここに何かが欠けている、誰かが説明することができますか?


更新:3つのブラウザでみました、クローム50.0.2661.86、サファリ9.1(50.0.2661.86)は、Firefox 44.0.2、すべてがエラーなしで実行します。

ESFiddleもエラーなしで実行されます。

CommentersレポートBabelもエラーなしで実行されます。

質問の元はhttp://tddbin.com/#?kata=es6/language/generator/send-functionで、第2番目のカタです。

+1

です。このコード例は私のために実行されません。 'Uncaught TypeError :(中間値)は関数ではありません。 ' –

+0

' yield'は '.next(...)'に渡すものを返します。あなたは '.next()'を2回だけ呼び出されたことを幸運にも思っています。それは次回にスローされます。 – Bergi

+0

@Ben:はい、しかし、それは質問をする...何がこのコードが最初に有効だったと信じるように導いたのですか?あなたはどこかでそれを見ましたか? –

答えて

4

I'm not sure how this works.

ええと、ええ、それはに動作してはなりません。それはバベルのバグのせいでしか働いていない。

yield doesn't return a function reference, so what are the parenthetical statements like (yield 2) doing - are they fat arrow anonymous functions without bodies? How are they called using partial application like that?

いいえ、それは実際には標準機能アプリケーションであり、魔法はありません。 yieldが関数参照を返す可能性があります。そうでなければ、それは第3の.next()呼び出しで例外をスローします。作業バージョンのための一例として、

function* generatorFunction() { 
    yield (yield 1)(yield 2)(yield 3)(); 
} 
var test = (a) => { 
    console.log(a); 
    return (b) => { 
    console.log(b); 
    return (c) => { 
     console.log(c); 
     return 4; 
    }; 
    }; 
}; 
var iterator = generatorFunction(); 
iterator.next(); // {value: 1, done: false} 
iterator.next(test); // {value: 2, done: false} 
iterator.next("a"); // "a" {value: 3, done: false} 
iterator.next("b"); // "b" undefined {value: 4, done: false} 
iterator.next("d"); // {value: undefined, done: true} 

だから、この仕事をどうしますか?なぜならバベルのバグのためですそれ

Commenters report Babel executes without errors as well.

function* generatorFunction() { 
    let fn1 = yield 1; 
    let a = yield 2; 
    let fn2 = fn1(a); 
    let b = yield 3; 
    let fn3 = fn2(b); 
    let res = fn3(); 
    let d = yield res; 
    return undefined; 
} 

としてこれらのネストされた/チェーン yield文は、より良い記述する必要があります。 transpiler outputを確認した場合、実際の動作は

function* generatorFunction() { 
    let fn1 = yield 1; 
    let a = yield 2; 
    let b = yield 3; 
    // these are no more executed with only 3 `next` calls 
    let fn2 = fn1(a); 
    let fn3 = fn2(b); 
    let res = fn3(); 
    let d = yield res; 
    return undefined; 
} 
+0

誰でもこのバグを報告したいですか? – Bergi

+2

['regenerator'](https://github.com/facebook/regenerator/issues/244)と[' Babel'](https://phabricator.babeljs.io/T7327)に記載されています。それを追跡してくれてありがとう。 – loganfsmyth