【问题标题】:Avoiding `this` with koa用 koa 避免 `this`
【发布时间】:2015-05-21 11:25:59
【问题描述】:

在 Koa 中,我们可以在不使用预先绑定的 this 的情况下访问 Koa Context 吗?

例如:this 分配给 Koa 上下文

app.use(function *(next) {
    this.url;
})

但是有没有类似的东西:

app.use(function *(next, ctx) {
    ctx.url;
})

为什么?假设我们使用箭头函数,this 不会是 koa 上下文:

app.use( function *( next ) {

    console.log( this.url ); // logs: "/"

    ( () => console.log( this.url ) )(); // logs: "undefined"

});

我知道我们可以做到:

app.use( function *( next ) {
    var ctx = this;
    ( () => console.log( ctx.url ) )(); // logs: "/"
});

和其他形式的绑定,但我想检查一下,按照设计,这是唯一的方法。

【问题讨论】:

  • 使用.bind(this)怎么样?这可以与胖箭头一起使用吗?另外,胖箭头的目的不是保护环境范围吗?也许您使用不正确?
  • 你为什么要这样做?
  • 做什么?抱歉不明白q。
  • 请注意,v2.0 提供了上下文作为参数
  • 你的前提是错误的。胖箭头函数不会劫持this。这是他们的主要特点之一。

标签: koa


【解决方案1】:

新答案:

它现在在 koa v2 中可用。

旧答案:
这不可能。中间件通过thunks(单参数函数)提供给应用程序,由co 提供。

截至写作(2015 年 4 月)co 中的 thunk 已弃用。所以 Koa 是留在他们身边还是转向承诺是未知的。我的 2p,来自其他函数式语言,thunk(和绑定上下文)阻碍了表现力......也许我错了,但是箭头函数就是一个例子

【讨论】:

    【解决方案2】:

    访问this

    Koa 运行每个中间件,this 绑定到一个上下文。访问请求和响应需要通过上下文 this

    这绝对是设计使然。如果需要,可以在变量中存储对上下文的引用:

    var self = this
    //or
    var ctx = this
    

    或者使用Function.prototype.bind:

    myArray.forEach( function( item ){
        console.log( this.url )
    }.bind( this ) )
    

    Koa 的设计

    我将解释 another answerthe Koa FAQ

    Express 的外观和感觉很像“标准节点做事方式”;它遵循http 模块设置的示例。

    另一方面,Koa 旨在取代“节点方式”。作者选择实现自己的理想来处理请求和中间件。 Koa 在this.requestthis.response 中公开了它自己的请求和响应版本,将原始节点reqres 分别保留在this.reqthis.res 中。

    这些例子应该让不同的心态成为焦点。

    Express 方法非常基于行动。

    app.use( function( req, res ){
        //SEND the response
        res.send( 'some text' )
    })
    

    Koa 方法非常“基于事实”。

    app.use( function*( next ){
        //The response IS this
        this.body = 'some text'
    })
    

    因此,Koa 似乎没有以程序方式将 reqres 传递给函数,而是将它们作为请求的属性(或“事实”)公开。

    【讨论】:

    • 您能否详细说明为什么这是设计使然?知道会很有趣,并会加入讨论。
    • @Ross,我已经尽我所能扩展了。希望对你有帮助
    猜你喜欢
    • 2016-09-21
    • 2010-10-01
    • 2018-11-02
    • 1970-01-01
    • 2015-08-15
    • 2013-11-06
    相关资源
    最近更新 更多