【问题标题】:Node.js: Response inside a promise [duplicate]Node.js:承诺中的响应[重复]
【发布时间】:2017-04-03 11:48:43
【问题描述】:

谁能解释一下为什么会这样:

somePromise()
    .then(content => res.status(200).jsonp(content))
    .catch(err => res.status(500).send(err));

不等同于

somePromise()
    .then(res.status(200).jsonp)
    .catch(res.status(500).send);

第一个代码运行良好,第二个不行???

谢谢!

【问题讨论】:

    标签: javascript node.js express promise es6-promise


    【解决方案1】:

    在第一个示例中,.jsonp.send 作为 res 对象上的方法被调用。为了使它们正常工作,这是必要的;他们必须有权访问响应对象。

    在第二个示例中,您传递了对.jsonp.send 函数的引用,但是当它们被调用时,它们不会作为res 上的方法被调用。这意味着它们无权访问响应对象,从而导致它们失败。

    更新: 之前,我说过您可以修改第二个示例以使用.bind,它应该可以工作:

    somePromise()
        .then(res.status(200).jsonp.bind(res))
        .catch(res.status(500).send.bind(res));
    

    这是不正确的。如果您执行上述操作,响应将始终具有 500 状态代码。那是因为执行是这样的:

    • res.status 设置为200
    • res绑定到.jsonp
    • res.status 设置为500。
    • res绑定到.send
    • 稍后:调用.jsonp.send。两者都绑定到res,其状态码设置为500

    【讨论】:

    • 我试过了,但都没有! ?
    • 是的,.bind 都不起作用。是的,也许第一个更漂亮嘿!但我想知道为什么不以其他方式工作。 jsonpsend 是函数......为什么不作为回调工作? ?
    • @AralRoca - 更新了我很确定问题所在。使用 .bind 确实保留了 res 上下文,这是您注意到的主要问题,但是还有一个单独的问题,res 的状态代码始终设置为 500。如果您在两者中删除 .status 调用应该看到.bind 工作
    • 但是像这样的问题就是为什么你的第一个例子更好:)
    猜你喜欢
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 2020-01-17
    相关资源
    最近更新 更多