javascript - NodeJS return http.request


Hej, nu ved jeg, at NodeJS er asynkront (hvilket jeg stadig prøver at forstå, for at være ærlig).

Problemet, som jeg i øjeblikket står overfor, er, at jeg har forsøgt at lave en http.request for at modtage nogle JSON-data. Det er fint, men det, jeg har brug for, er at returnere disse data til en variabel. Jeg tror, jeg skal bruge en callback-funktion? (ud fra hvad jeg har læst om emnet)

Koden, jeg har lige nu:

var http = require('http');
pCLatLng = '';

function postCodeCheck() {
    var pCode = { 
        host: 'geo.jamiethompson.co.uk',
        path: "/" + 'SW1A2AA' + ".json" 
    };

    http.request(pCode).on('response', function(response) {
        var data = '';
        response.on("data", function (chunk) {
            data += chunk;
        });
        response.on('end', function () {
            pCJSON = JSON.parse(data);
            pCLatLng = pCJSON;
        });
        }).end();
}

console.log(pCLatLng);

Dette giver åbenlyst "undefined"; jeg har prøvet at returnere response.on('end'), når jeg har returneret "hi" eller noget som helst inden i det, men i stedet udskriver NodeJS oplysningerne om siden. Hvis nogen kan hjælpe med dette, ville det være meget værdsat.

Svar #1

console.log(pCLatLng); skal være inde i (eller inde i noget, der kaldes af) response.on('end' callbacken. Værdien er ikke tilgængelig, før den callback bliver udløst.

Prøv noget som:

function postCodeCheck(callback) {
    var pCode = { 
        host: 'geo.jamiethompson.co.uk',
        path: "/" + 'SW1A2AA' + ".json" 
    };

    http.request(pCode).on('response', function(response) {
        var data = '';
        response.on("data", function (chunk) {
            data += chunk;
        });
        response.on('end', function () {
            callback(JSON.parse(data));
        });
        }).end();
}

postCodeCheck(function (pCLatLng)
{
    console.log(pCLatLng);
});

Svar #2

Du vil have noget som dette:

var http = require('http');

function postCodeCheck(cb) {
    var pCode = { 
        host: 'geo.jamiethompson.co.uk',
        path: "/" + 'SW1A2AA' + ".json" 
    };

    http.request(pCode).on('response', function(response) {
        var data = '';
        response.on("data", function (chunk) {
            data += chunk;
        });
        response.on('end', function () {
            var pCJSON = JSON.parse(data);
            cb(pCJSON);
        });
        }).end();
}

postCodeCheck(function(pCLatLng) { console.log(pCLatLng); });

Se nøje efter forskellene, før du bruger.