当承诺在coffeescript中进行链接时,为此定义的函数需要绑定到'this'。
$q.fcall somecall
.then ((url)->
dosomething()
).bind(this)
.catch (err)->
console.log 'error occured', err
但是,以上编译成以下内容,这是错误的。那怎么写呢?或者有没有办法让coffeescript代表这个?
$q.fcall(somecall).then(((function(url) {
dosomething()
}).bind(this))["catch"](function(err) {
return console.log('error occured', err);
})));
答案 0 :(得分:3)
使用=>
而不是自己绑定它,它会更容易阅读并且更正确。
$q.fcall somecall
.then (url) =>
dosomething()
.catch (err)->
console.log 'error occured', err
然而,由于你没有在你的功能中引用this
,这并没有多大意义。您可能希望实际上直接将dosomething
传递给then()
,以便保留其ThisBinding
。
答案 1 :(得分:1)
仅仅因为你可以使用匿名函数并不代表你必须这样做。给回调名称通常会产生更清晰的代码:
some_descriptive_name = (url) ->
dosomething()
the_error = (err) ->
console.log 'error occurred', err
$q.fcall somecall
.then some_descriptive_name.bind(@)
.catch the_error
或者:
some_descriptive_name = (url) => # fat-arrow instead of bind
dosomething()
the_error = (err) ->
console.log 'error occurred', err
$q.fcall somecall
.then some_descriptive_name
.catch the_error
如果你的功能只是一行,那么匿名功能就可以了,但如果它们更长,那么很容易迷失在CoffeeScript的空白中。