javascript - NodeJS return http.request


Hei, nå vet jeg at NodeJS er asynkront (noe jeg fortsatt prøver å få hodet rundt, for å være ærlig).

Problemet jeg for øyeblikket står overfor er at jeg har forsøkt å gjøre en http.request for å motta noen JSON-data. Dette er greit, men det jeg trenger er å returnere disse dataene til en variabel. Jeg tror jeg trenger å gjøre en callback-funksjon? (fra det jeg har lest om saken)

Koden jeg har for øyeblikket:

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 gir åpenbart ut "undefined"; jeg har prøvd å returnere response.on('end') når jeg har returnert "hi" eller noe som helst inni det, men NodeJS viser informasjonen om nettstedet. Hvis noen kan hjelpe med dette, ville det blitt veldig satt pris på.

Svar #1

console.log(pCLatLng); må være inne i (eller inne i noe som kalles av) response.on('end' callback. Verdien er ikke tilgjengelig før den callbacken blir kjørt.

Prøv noe 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 ha noe sånt 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øye etter forskjellene før du bruker.