Node.js中如何在then函数内调用同文件中的其他函数?
解决Cannot read property 'getLatLng' of undefined的问题
这个错误的核心原因是回调函数里的this指向不对。在then()的普通函数回调里,this并不会指向你的模块导出对象(也就是exports),所以调用this.getLatLng自然会拿到undefined。下面给你几种可行的修复方案,还顺便优化下代码里的小问题:
方案1:用箭头函数继承外部this
箭头函数不会绑定自己的this,它会沿用外层函数(也就是correctDataWOLatLng)的this指向,这样就能正常调用getLatLng了:
exports.getLatLng = function(attractionId, attractionName){ // 这里要返回promise,否则调用方没法处理异步结果 return googleMapsClient.geocode({address: attractionName}).asPromise() .then((response) => { const tmp = response.json.results; // 声明变量,避免全局污染 return tmp; }) .catch((err) => { console.log(err); // 抛出错误让调用方可以处理 throw err; }); } exports.correctDataWOLatLng = function(){ model.getMySQLDataWOLatLng().then((result) => { // 改成箭头函数 console.log(result); this.getLatLng(0, "lalbagh bangalore"); }); };
方案2:提前保存this到变量里
如果习惯用普通函数回调,可以在correctDataWOLatLng开头把this存到一个变量(比如self)里,后续用这个变量调用方法:
exports.getLatLng = function(attractionId, attractionName){ return googleMapsClient.geocode({address: attractionName}).asPromise() .then((response) => { const tmp = response.json.results; return tmp; }) .catch((err) => { console.log(err); throw err; }); } exports.correctDataWOLatLng = function(){ const self = this; // 保存外部的this model.getMySQLDataWOLatLng().then(function(result) { console.log(result); self.getLatLng(0, "lalbagh bangalore"); // 用self代替this }); };
方案3:直接调用exports.getLatLng
因为getLatLng本身就是挂载在exports上的,直接用exports.getLatLng调用最直接,完全不用纠结this指向:
exports.getLatLng = function(attractionId, attractionName){ return googleMapsClient.geocode({address: attractionName}).asPromise() .then((response) => { const tmp = response.json.results; return tmp; }) .catch((err) => { console.log(err); throw err; }); } exports.correctDataWOLatLng = function(){ model.getMySQLDataWOLatLng().then(function(result) { console.log(result); exports.getLatLng(0, "lalbagh bangalore"); // 直接调用exports上的方法 }); };
另外还要注意:原代码里的tmp没有用let/const声明,会变成全局变量,这是个不好的习惯,记得加上变量声明。还有getLatLng函数里要返回promise,不然你调用它的时候没法用.then()处理返回的地理编码结果,我在上面的修复代码里已经加上了返回语句和错误抛出,这样调用方可以更好地处理异步流程。
内容的提问来源于stack exchange,提问作者Akash Prasanna Basabhat
相关产品推荐
相关产品推荐

