我正在建立一个更新用户个人资料的PUT
功能。通过这样做,我想转换地理位置坐标中的地址,以启用地理位置搜索。
我试图异步执行此操作,但我在使其工作方面遇到了一些麻烦。
这是我的功能:
//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'});
});
});
答案 0 :(得分:1)
这是旧的“我如何在JavaScript中进行异步编程”的问题。您必须从回调中调用save函数:
//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'});
});
});
});
答案 1 :(得分:0)
尝试使用console.logs或内置(https://nodejs.org/api/debugger.html)或Webstorm之类的调试器仔细跟踪代码和回调。您需要仔细跟踪执行情况,因为回调和承诺的工作方式令人困惑,直到您真正习惯它为止。
然后,一旦了解了代码执行的顺序,就可以使用promise链中的另一个.then
来解决问题,或者将其转换为使用async/await
语法并使用babel进行编译。
使用async/await
是最直接,最易于理解/可理解的方式,但你可能真的必须学习回调和承诺才能充分利用它。