Как да получите стойности от функциите за обратно извикване в 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