【问题标题】:named function does not resolve or reject promise命名函数不解析或拒绝承诺
【发布时间】:2017-02-13 10:28:33
【问题描述】:

当我将 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);
        });
    });
}

【问题讨论】:

  • 当然不行,在这段代码中var handleResponse = (error, soapResponse) => { return resolve(soapResponse); }没有定义。当handleResponse 被创建(解析和解释)时,它绑定到外部上下文(闭包)。 handleResponse 不知道以后怎么用。
  • @dfsq - 所以没有办法将回调从父函数中抽象出来以进行单元测试?

标签: javascript node.js ecmascript-6 promise es6-promise


【解决方案1】:

您没有传递resolvereject 函数,因此resolve(soapResponse); 将不起作用。

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

这是一个使用柯里化的例子:

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

【讨论】:

  • 爱它!工作完美。 currying 是我最喜欢的新事物。
  • 只是一个旁注,如果你没有使用箭头函数而不是currying,你可以使用bind。如果你还没有,我建议你也检查一下。这是 javascript 中最重要的概念之一。
猜你喜欢
  • 2014-05-27
  • 2018-05-11
  • 1970-01-01
  • 2018-12-02
  • 2023-03-26
  • 2017-08-19
  • 1970-01-01
  • 2013-06-22
  • 1970-01-01
相关资源
最近更新 更多