2016-12-21 13 views
1

ここ数時間、私は完全に詰まっています。ジェネレータ関数への引数の受け渡し

どのようにジェネレータ関数にパラメータを渡すのですか?

function* getFoo(foo) { 
    return yield Promise.resolve(foo + 10); 
} 

exports.testRoute = Promise.coroutine(function* (req, res) { 
    let bar = yield Promise.coroutine(getFoo); // <--- how to pass argument?? 
    res.send(bar.toString()); 
}); 

現在のコードは(と私はそれがhereに私を指して知っているが、それは、引数の受け渡しについては何も言いません)エラーをスロー:

Unhandled rejection TypeError: A value [object Promise] was yielded that could not be treated as a promise 
    See http:// goo.gl/4Y4pDk 
From coroutine: 
    at Function.module.exports.Promise.coroutine (d:\Workspace\Github\API-NodeJS\app\node_modules\bluebird\js\main\generators.js:111:17) 

私はこれを行う場合は、次の

let bar = yield Promise.coroutine(getFoo(5)); 

私は次のエラーが発生します(再度自明のエラーですが、this linkは)どちらか渡す引数を説明していません:あなたはPromise.coroutineが何をするかを理解する必要があり

function* getFoo(foo) { 
    return yield Promise.resolve(foo + 10); 
} 

exports.testRoute = Promise.coroutine(function* (req, res) { 
    let bar = yield Promise.coroutine(getFoo)(50); 
    res.send(bar.toString()); 
}); 

Unhandled rejection TypeError: generatorFunction must be a function 
    See http:// goo.gl/6Vqhm0 
    at Function.module.exports.Promise.coroutine (d:\Workspace\Github\API-NodeJS\app\node_modules\bluebird\js\main\generators.js:107:15) 
+0

'私は、コンテキストを誤解するかもしれませんが、あなただけの'収量Promise.coroutine(getFoo.bindを(ヌル、5))で行うことはできませんか? – LINKIWI

+0

@LINKIWIいいえ、私は最初のエラーを得る**値[オブジェクトの約束]が得られた... ** – Shaharyar

答えて

1

私が何をしたいことはこれだと思います。それはジェネレータをとり、約束を返す関数を返します。 yield Promise.coroutine(getFoo(5));(第2のケースで

A value [object Promise] was yielded that could not be treated as a promise 

:最初のケース(yield Promise.coroutine(getFoo);)に見るよう

、関数としないエラーをもたらす約束、あるPromise.coroutineの結果をもたらすれます)、発電機を始動するだけです。 getFoo(5)は "ジェネレータ"オブジェクトを返しますが、Promise.coroutineは "ジェネレータ関数"を要求します。結果はgeneratorFunction must be a functionです。

事実ブルーバードはPromise.coroutineの結果を示しています。[object Promise]は、Promise.coroutineが代わりに関数を返さなければならないので混乱の原因となりますが、私はそれを理解できませんでした。私はあなたが別の質問としてそれを求めることができると思います。

+0

うん、ちょうど最近それが分かった。これはずっと簡単だとは思わなかった。 – Shaharyar

+0

うん、ブルーバードが 'yield'キーワード*の隣に' Promise'を期待しているからです(私が 'testRouter'を' Promise.coroutine'にラップしたのがわかります) – Shaharyar

関連する問題