我想在同一个控制器中调用一个函数,但我大多有一个错误:“ReferenceError:myFunctionB未定义”
module.exports = {
myfunctionA: function(req, res){
var theword;
theword = myFunctionB({id:26})
return res.json({say:theword})
},
myfunctionB: function(req, res){
var id = req.param('id');
niceword.get({
id:id
}, function(err, word){
if(err){return res.negotiate(err);}
if(!word){return res.json({err:"no word found"})}
return res.json({word:word});
})
}
}
我还尝试将myFunctionB放入服务中,但是,因为我使用了许多其他控制器等,所以我没有回复..任何想法?
答案 0 :(得分:1)
有几种方法可以做到这一点。正如yBrodsky所说,正确的方法是创建一个运行回调或返回承诺的服务:
myServiceFunctionB: function(params, cb) {
var id = params.id;
niceword.get({
id:id
}, function(err, word){
return cb({ say: { word: word });
});
}
然后在你的控制器中,只需使用:
return MyServiceName.myServiceFunctionB({id: 26}, res.json);
您还可以传递您的req和res以继续使用它们:
myServiceFunctionB: function(req, res) { ...
或者,您可以在控制器中使用this
关键字:
myfunctionA: function(req, res){
req.params.id = 26;
return this.myfunctionB(req, res);
}
如果您将在上下文丢失的情况下执行更复杂的逻辑,只需在开头设置一个新的var:
myfunctionA: function(req, res){
var self = this;
req.params.id = 26;
//...lots of nested promises or callbacks...
return self.myfunctionB(req, res);
}
答案 1 :(得分:0)
谢谢yBrodsky和wwwslinge,我最终得到了我需要的感谢。
我不得不做一点改动,因为我们仍需要在传入函数后使用数据。
控制器
MyServiceName.functionB({id:1}, function(data){
// doing some stuff with the data and then
return res.json({data: data});
});
服务
functionB: function(params, cb){
var id = params.id;
Niceword.getbyid({
id:id
}, function(err, word){
if(err){return err}
return cb({word:word});
})
}