【问题标题】:Why can't I pass Node request methods directly to Bluebird promises? [duplicate]为什么我不能将 Node 请求方法直接传递给 Bluebird Promise? [复制]
【发布时间】:2015-04-06 14:53:43
【问题描述】:

应该完全可以运行类似以下的东西:

function someMiddleware (req, res, next) {        
    someAsyncBluebirdOperation().then(res.json);
}

但是,如果您在解析处理程序中直接将 res 对象的任何方法作为引用传递,您将收到以下无用的错误:

[TypeError: Cannot call method 'get' of undefined] __stackCleaned__: true

如果您将对 res.json 的调用包装在另一个函数中,一切似乎都很好:

function someMiddleware (req, res, next) {        

    function wrapper(result) {
        res.json(result);
    }

    someAsyncBluebirdOperation().then(wrapper);
}

我只能假设绑定/作用域发生了一些问题,但是将调用包装在另一个函数中感觉完全没有必要。

【问题讨论】:

  • 这并不能解决问题。 .then 方法只需调用一个函数。 res.json 是一个函数。它应该接受它。
  • res.json 不是函数而是方法——这意味着它依赖于this。虽然在这种情况下可能会很烦人,但它比需要携带上下文的函数要好得多,因为它可以静态分配。 Response 类可以自动绑定其方法,但是当 res.json 可以作为方法正常调用时(大多数情况下可以),这是一个巨大的性能损失。

标签: javascript node.js promise bluebird


【解决方案1】:

可能它需要作为方法调用,.then 不这样做。尝试使用.bind

function someMiddleware (req, res, next) {        
    someAsyncBluebirdOperation().then(res.json.bind(res));
}

【讨论】:

    猜你喜欢
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多