如何使用地理编码器获取地理位置并使用承诺保存数据?

我正在build立一个更新用户configuration文件的PUTfunction。 通过这样做,我想要在地理位置坐标中转换地址,以启用地理定位search。

我试图做到这一点asynchronous,但我有一些麻烦,使其工作。

在这里我的function:

 //PUT: Update profile app.put('/api/userData', isLoggedInAjax, function(req, res){ var user = req.user; user.profile.username = req.body.username; user.profile.instrument = req.body.instrument; user.profile.location.country = req.body.country; user.profile.location.city = req.body.city; user.profile.location.zip = req.body.zip; user.geolocation = []; var address = req.body.zip +' '+req.body.city +' '+req.body.country; nodeGeocoder.geocode(address) .then(function(result){ user.geolocation[0] = result[0].longitude; user.geolocation[1] = result[0].latitude; return user; }); user.save(function(err){ if (err) res.send(err); res.json({ message: 'profile udated'}); }); }); 

这是旧的“如何在JavaScript中执行asynchronous编程”的问题。 您必须从callback中调用保存function:

 //PUT: Update profile app.put('/api/userData', isLoggedInAjax, function(req, res){ var user = req.user; user.profile.username = req.body.username; user.profile.instrument = req.body.instrument; user.profile.location.country = req.body.country; user.profile.location.city = req.body.city; user.profile.location.zip = req.body.zip; user.geolocation = []; var address = req.body.zip +' '+req.body.city +' '+req.body.country; nodeGeocoder.geocode(address) .then(function(result){ user.geolocation[0] = result[0].longitude; user.geolocation[1] = result[0].latitude; user.save(function(err){ if (err) res.send(err); res.json({ message: 'profile udated'}); }); }); }); 

请仔细使用console.logs或类似内置( https://nodejs.org/api/debugger.html )或Webstorm的debugging器来仔细追踪代码和callback。 您将需要仔细追踪执行情况,因为callback和承诺的工作方式令人困惑,直到您真正熟悉它为止。

然后,一旦理解了代码的执行顺序,就可以使用另一个。然后在promise链中解决问题.then或者将其转换为使用async/await语法并使用babel进行编译。

使用async/await是最直接,最易于维护/可理解的方式,但是为了充分利用它,你可能还得学习callback和承诺。