Keresés

Új hozzászólás Aktív témák

  • Karma

    félisten

    válasz Sleed #4101 üzenetére

    Nem véletlenül írtam privátot, hogy kifejtem bővebben :P

    No de (hahaha), akkor következzen egy egyszerű példa a te feladatodra. Egy plusz modul kell hozzá, a when. Ott kezdődik a dolog, hogy a requestből készíteni kell egy olyan változatot, ami callback függvény helyett egy ígérettel tér vissza.

    (Az ígéret egy olyan objektum, ami majd valamikor a jövőben fog kiértékelődni, vagy sikeresen, vagy nem. Mindkét ágra fel lehet iratkozni külön, és ha láncba fűzi őket az ember, akkor úgy viselkedik, mint a rendes függvényhívások - az eredmények lépésről lépésre átpasszolódnak, a hiba meg az egészet megszakítja.)

    Szóval a request függvényt be kell foglalni (ezt csinálja a requestP függvény), utána mehet a lényeg. Bátorkodtam kicsit egyszerűsíteni a kigyűjtésen, ha már van a cheerionak is map függvénye.

    var when = require('when'),
    cheerio = require('cheerio'),
    request = require('request');

    function requestP(url) {
    return when.promise(function (resolve, reject) {
    request(url, function (err, res, body) {
    if (err) {
    return reject(err);
    } else if (res.statusCode !== 200) {
    err = new Error("Unexpected status code: " + res.statusCode);
    err.res = res;
    return reject(err);
    }
    resolve(body);
    });
    });
    }

    requestP('https://news.ycombinator.com')
    .then(function (html) {
    var $ = cheerio.load(html);

    return $('span.comhead').map(function (i, element) {
    return $(element).prev();
    });
    })
    .then(function (articles) {
    console.log(articles);
    })
    .catch(console.error);

  • Karma

    félisten

    válasz Sleed #4099 üzenetére

    Azért bonyolultabb ennél a helyzet, mert a request szigorúan aszinkron működik, azt mondani a Node-nak hogy "most fagyjál le amíg megjön a válasz" nem lehet.

    Ha csak egy valamit akarsz csinálni, kirakhatod a callback függvényt egy külön, külső függvénybe, és név szerint adhatod oda a requestnek. Ezzel el lehet lavírozni, de tisztább, ha vagy az async, vagy a promise-alapú modulok (Q, when) valamelyikét berakod és láncot fűzöl a jövőbeli hívásokból.

    Amit linkeltem forrás a whent használja erre.

  • Karma

    félisten

    válasz Sleed #4097 üzenetére

    Persze, csak rakd be a végső kiírást a feldolgozás végére.

    var request = require('request');
    var cheerio = require('cheerio');

    var szoveg = new Array();

    request('https://news.ycombinator.com', function (error, response, html) {
    if (!error && response.statusCode == 200) {
    var $ = cheerio.load(html);
    $('span.comhead').each(function(i, element){
    var a = $(this).prev();
    szoveg.push(a);
    });
    }

    console.log(szoveg); // <--- lentről, ide
    });

Új hozzászólás Aktív témák

Hirdetés