Rob*_*kal 4 javascript pointfree express
今天有些事让我大吃一惊.我遇到了一堆快速路由处理程序基本上看起来像这样(有更多和真正的函数调用,但为了易读性:
app.get('/api/foo', (req, resp) => {
Promise.resolve({one: 1})
.then(data=>resp.json(data))
})
Run Code Online (Sandbox Code Playgroud)
所以我作为聪明的javascript程序员,认为我可以离开匿名函数,然后让then函数直接调用resp.json:
app.get('/api/foo', (req, resp) => {
Promise.resolve({one: 1})
.then(resp.json)
})
Run Code Online (Sandbox Code Playgroud)
但是当我尝试时,我从来没有得到响应,并在节点控制台中看到这个:
未处理的promise promise(拒绝id:1):TypeError:无法读取undefined的属性'app'
对我来说.then(resp.json)和.then (data => resp.json(data))应该是等价的.当然,这是一个范围的事情,但我喜欢解释,也许是一种解决方法.
那是因为它resp是一个拥有它自己属性的对象,所以json函数使用的数据很可能包含在resp对象中.
当您将函数resp.json单独传递给它时then,您不会传递resp对象或其任何信息.本质上,then调用只是json从resp对象"借用"函数.只是函数体本身,没有范围或隐含值.
很可能,函数体在某处json使用this,此时你将获得一个无效的(可能是全局的)对象,而不是resp.
为了补救,你可以做到
Promise.resolve({one: 1})
.then(resp.json.bind(resp))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |