2016-11-30 7 views
3

今日は私に大きな驚きがありました。私は基本的に次のようになり特急ルートハンドラの束を越えカム(複数あると、実際の関数が呼び出されますが、再現性のために:Promise.thenでは、ポイントフリーのファッションでExpressとcalling response.jsonが動作しません。

app.get('/api/foo', (req, resp) => { 
    Promise.resolve({one: 1}) 
    .then(data=>resp.json(data)) 
}) 

だから私は、賢いJavaScriptのプログラマが考えるほど、私は離れてからステップ実行することができます匿名関数とちょうど直接、関数呼び出しresp.jsonを聞かせて:

app.get('/api/foo', (req, resp) => { 
    Promise.resolve({one: 1}) 
    .then(resp.json) 
}) 

しかし、私は、応答を取得していないと、ノードコンソールでこれを見ないことをしようとすると:

Unhandled promise rejection (rejection id: 1): TypeError: Cannot read property 'app' of undefined

.then(resp.json)と.then(データ=> resp.json(データ))私の目に相当する必要があります。それは確かに範囲のことですが、私は説明とおそらく回避策が大好きです。 respjson関数によって使用されるので、より多くの可能性が高いデータがrespオブジェクト内に含まれる、それ自身の特性を持つオブジェクトであるためだ

答えて

4

を単独でthenに渡すときには、respオブジェクトまたはその情報のいずれかと一緒に渡されません。 本質的には、thenコールは、をrespオブジェクトから「借用」しているだけです。スコープや暗黙的な値はなく、関数本体自体です。おそらくより

より、jsonの関数本体は、あなたの代わりにrespの、無効な(おそらくグローバル)オブジェクトを取得しますその時点でthisどこかを、使用しています。解決するには

、あなたは彼らが原因かthe this operator works in javascriptで同じではありません

Promise.resolve({one: 1}) 
    .then(resp.json.bind(resp)) 
+0

ハ。あなたは正しいです。私はちょうどそれを考え出した。ありがとう!しかし、その '醜いそのように、太い矢印の機能を使用することもできます。 –

3

を行うことができます。

resp.json(data)は、で関数を呼び出し、resp.jsonではthis===globalで関数を呼び出します。

修正するには、バインドされたパラメータ.then(resp.json.bind(resp))を持つ関数を渡します(または矢印関数を使用します)。

関連する問題