在表示请求的类中,我尝试使用Q promises处理它,之后,有两个简单的处理程序来发送处理结果。为什么这不起作用:
Request.prototype.process = function() {
var that = this;
return that.getParameter('method')
.then(function(method) {
// ... Some processing
})
.then(that.replyOK)
.fail(that.replyError);
};
但这样做:
Request.prototype.process = function() {
var that = this;
return that.getParameter('method')
.then(function(method) {
// ... Some processing
})
.then(function(error) {
that.replyOK(error);
})
.fail(function(error) {
that.replyError(error);
});
};
答案 0 :(得分:1)
JavaScript主要是词法范围。这意味着:
function foo(){
var that = this;
//...
}
在foo that
的以下行中访问的变量设置为您期望的变量。如果传递函数并在其他地方定义了locals,则that
不会在其词法(变量)环境中被捕获。
JavaScript也有动态this
,方法' this
由当前调用对象决定。例如:
var a = {
x:3,
getX:function(){ return this.x; }
};
var b = {x:5};
b.getX = a.getX;
b.getX(); // returns 5
a.getX(); // returns 3
a.getX.call(b); // set `this` explicitly with .call, returns 5
var x = a.getX;
x(); // global x or undefined.
可以使用this
固定Function.prototype.bind
:
Request.prototype.process = function() {
return this.getParameter('method')
.then(function(method) {
// ... Some processing
})
.then(this.replyOK.bind(this))
.fail(this.replyError.bind(this));
};
或者,在EcmaScript 6语法中(尚未在节点中提供,但很快):
Request.prototype.process = () => { // arrow functions have lexical `this`
return that.getParameter('method')
.then(function(method) {
// ... Some processing
})
.then(this.replyOK)
.fail(this.replyError);
};