2017-02-13 9 views
0

私が約束の解決/拒否処理を名前付き関数に移すと、それが機能しません。なぜ誰かが説明してくれますか?名前付き関数が約束を解決または拒否しない

作品:

function getPremium(policyNumber, agentNumber) { 
    return new Promise(function (resolve, reject) { 
     soap.createClient(wsdl, function (error, client) { 
      client.addSoapHeader(soapHeader()); 
      client[config.webMethodName](soapBody(number), (error, soapResponse) => { 
       return resolve(soapResponse); 
      }); 
     }); 
    }); 
} 

は動作しません:

var handleResponse = (error, soapResponse) => { 
    return resolve(soapResponse); 
} 

function getPremium(policyNumber, agentNumber) { 
    return new Promise(function (resolve, reject) { 
     soap.createClient(wsdl, function (error, client) { 
      client.addSoapHeader(soapHeader()); 
      client[config.webMethodName](soapBody(number), handleResponse); 
     }); 
    }); 
} 
+1

それは、このコード 'のvarのhandleResponseは=(エラー、soapResponse)=> {リターン解決(soapResponse)には、動作しません。 } 'は定義されていません。 'handleResponse'が作成(解析および解釈)されると、それは外部コンテキスト(クロージャ)にバインドされます。 'handleResponse'は将来どのように使用されるのかわかりません。 – dfsq

+0

@ dfsq - ユニットテストのために親関数からコールバックを抽象化する方法はありませんか? –

答えて

0

あなたは、このように、resolve(soapResponse);は動作しません、resolvereject機能に沿って通過していません。

これらをパラメーターリストに追加し、handleResponse関数に渡します。

ここでカリー化を使用した例です:もちろん

var handleResponse = (resolve, reject) => (error, soapResponse) => { ... } 
client[config.webMethodName](soapBody(number), handleResponse(resolve, reject)); 
+0

大好き!完璧に働いた。カレーは私の新しいお気に入りです。 –

+0

ちょっとしたことに、あなたがカリングの代わりに矢印関数を使っていなかったら、あなたは 'bind'を使っている可能性があります。もしあなたがまだそれをしていなければ、あなたもそれをチェックすることをお勧めします。これは、javascriptで知っておくべき最も重要な概念の1つです。 –

+0

、ありがとう –

関連する問題