Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用geocoder获取地理位置并使用promises保存数据?_Javascript_Node.js - Fatal编程技术网

Javascript 如何使用geocoder获取地理位置并使用promises保存数据?

Javascript 如何使用geocoder获取地理位置并使用promises保存数据?,javascript,node.js,Javascript,Node.js,我正在建立一个PUT函数来更新用户配置文件。通过这样做,我想转换地理位置坐标中的地址,以便启用地理位置搜索 我正在尝试异步执行此操作,但在使其工作时遇到了一些困难 以下是我的职能: //PUT: Update profile app.put('/api/userData', isLoggedInAjax, function(req, res){ var user = req.user; user.profile.username = req.body.us

我正在建立一个
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'});
    });
});
这是一个古老的“如何使用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'});
        });
    });
});

尝试使用console.logs或内置()或Webstorm之类的调试器仔细跟踪代码和回调。您需要仔细跟踪执行情况,因为回调和承诺的工作方式令人困惑,直到您真正习惯为止

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

使用
async/await
是最简单、可维护/可理解的方法,但是为了利用它,您可能真的必须很好地学习回调和承诺