我正在尝试创建一个处理我的json响应的主方法,但我遇到的问题是它在我这样做时会挂起。
这是我在转换它之前所拥有的,它运行良好(highscores
返回Promise
)。
var main = {
req: {}, res: {}, action: "",
handleRequest: function(req, res){
this.req = req;
this.res = res;
this.action = "Highscores";
this.getAction();
}),
getAction: function(){
$this = this;
if(this.action === "Highscores"){
highscores.get.highscores({gameId: this.body.gameId}).then(function(docs){
$this.res.setHeader("Content-Type", "text/json; charset=utf-8");
$this.res.setHeader("Access-Control-Allow-Origin", "*");
$this.res.write(JSON.stringify(docs));
$this.res.end();
}, function(err){
$this.res.end();
});
}
}
}
然后我将其转换为:
var main = {
req: {}, res: {}, action: "",
handleRequest: function(req, res){
this.req = req;
this.res = res;
this.action = "Highscores";
this.getAction();
}),
getAction: function(){
if(this.action === "Highscores"){
highscores.get.highscores({gameId: this.body.gameId}).then(this.respond, this.error);
}
},
respond: function(docs){
this.res.setHeader("Content-Type", "text/json; charset=utf-8");
this.res.setHeader("Access-Control-Allow-Origin", "*");
this.res.write(JSON.stringify(docs));
this.res.end();
},
error: function(err){
console.log(err);
this.res.end();
}
};
当我转换它时,它会挂起this.res.setHeader("Content-Type", "text/json; charset=utf-8");
并且Chrome控制台显示它处于待处理状态,并且永远不会以200
结束。
造成这种情况的原因是什么?
答案 0 :(得分:2)
当您传递类似函数(.then(this.respond, this.error)
)时,您将丢失该函数的上下文(this
),因为您只是传递函数本身。因此,当最终调用respond()
时,this
的值可能设置为全局上下文或其他一些对象/值。
如果要保持相同的结构,快速简便的方法是使用绑定版本的函数:.then(this.respond.bind(this), this.error.bind(this))
。否则,您将需要使用包装函数,该函数使用适当的上下文调用这两个函数(例如.then(function(docs) { self.respond(docs) }, function(err) { self.error(err) })
)(假设var self = this
内有getAction()
)。