Как получить значения из функций обратного вызова в NodeJS?

Я действительно новичок в NodeJs, и я делаю быстрое приложение для изучения, в этом приложении я хочу использовать широту и долготу, предоставленные пользователем, для обратного геокодирования адреса через node-geocoder, приведенный ниже код позволяет мне сохранить модель в базе. Я хочу, чтобы пользователь знал, был ли процесс успешным, как я могу получить значение из состояния в функции сохранения и передать его в ответ?

Заранее спасибо.

app.post('/persons', function (req, res){
  var createPersonWithGeocode = function (callback){
    var lat=req.body.latitude;
    var lon=req.body.longitude;
    var status;
     function geocodePerson() {
        geocoder.reverse(lat,lon,createPerson);
     }
    function createPerson(err, geo) {
        var geoPerson = new Person({
            name:       req.body.name,
            midname:    req.body.midname,
            height:     req.body.height,
            gender:     req.body.gender,
            age:        req.body.age,
            eyes:       req.body.eyes,
            complexion: req.body.complexion,
            hair:       req.body.hair,
            latitude:   req.body.latitude,
            longitude:  req.body.longitude,
            geocoding:  JSON.stringify(geo),
            description:req.body.description,
        });
        geoPerson.save(function (err) {
            if (!err) {
                console.log("Created");
                status="true";
            } else {
                console.log(err);
                status="false";
            }
        });
    }
    geocodePerson();
  }
  return res.send(createPersonWithGeocode());
});

person torresomar    schedule 27.04.2014    source источник
comment
Дайте угадаю: вам еще предстоит разобраться в концепциях асинхронного кодирования? (И вот несколько периодов, используйте их: ............)   -  person MaxArt    schedule 27.04.2014
comment
Спасибо за ответ Макс. Извините за периоды, но английский не мой родной язык (хотя и не оправдание). Еще раз спасибо за помощь :)   -  person torresomar    schedule 27.04.2014
comment
Пожалуйста. И ваш английский в конце концов просто прекрасен (но эй, я тоже не носитель английского языка).   -  person MaxArt    schedule 27.04.2014


Ответы (1)


Вы никогда не сможете получить статус ответа, если ничего не сделаете с функцией обратного вызова. Прежде всего:

geoPerson.save(function (err) {
    if (!err) {
        console.log("Created");
        status="true";
    } else {
        console.log(err);
        status="false";
    }
    callback(status);
});

Теперь вы должны предоставить функцию обратного вызова, которая отправит ответ. Вместо

return res.send(createPersonWithGeocode());

ты должен сделать

createPersonWithGeocode(function(status) {
    res.send(status);
});

Вот как работает асинхронный код.

person MaxArt    schedule 27.04.2014
comment
Спасибо сработало как шарм. Я пробовал аналогичный подход, прежде чем публиковать вопрос, но как-то облажался. Мне нужно будет больше узнать о том, как правильно использовать обратные вызовы. - person torresomar; 27.04.2014
comment
@OmarTorres Да, действительно, если вам нужно кодировать с помощью NodeJS, это абсолютно самая фундаментальная вещь, с которой вы должны быть уверены. В NodeJS все должно быть асинхронным, и это привело к тому, что многие программисты сошли с ума от этой новой философии кодирования. Однако есть инструменты, которые могут вам помочь (а именно, Promises). - person MaxArt; 27.04.2014