2017-02-13 78 views
0

当我将promise的解析/拒绝处理移动到命名函数时,它不起作用。有人可以解释为什么请吗?命名函数不解决或拒绝承诺

作品:

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

你不是沿着resolvereject功能传球,因此,resolve(soapResponse);将无法​​正常工作。

将这些添加到参数列表并将它们传递给handleResponse函数。

下面是使用钻营一个例子:

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

爱它!工作完美。咖喱是我最喜欢的东西。 –

+0

只是一个侧面说明,如果你不使用箭头函数而不是咖喱,你可以使用'bind'。如果你还没有,我建议你也检查一下。这是javascript中应该知道的最重要的概念之一。 –

+0

会做,谢谢 –