Frage Async / Warte mit Request-Promise gibt Undefined zurück


Ich habe zwei Dateien; server.js und scrape.js, unten sind die Code-Snippets, wie sie derzeit stehen.

server.js:

const scrape = require("./scrape");

async function start() {
    const response = await scrape.start();
    console.log(response);
}

start();

und scrape.js:

const cheerio = require("cheerio");
const request = require("request-promise");

go = async () => {

const options = {
  uri: "http://www.somewebsite.com/something",
  transform: function(body) {
    return cheerio.load(body);
  }
};

request(options)
  .then($ => {
    let scrapeTitleArray = [];
    $(".some-class-in-html").each(function(i, obj) {
      const data = $(this)
        .text()
        .trim();
      scrapeTitleArray.push(data);
    });
    return scrapeTitleArray;
  })
  .catch(err => {
    console.log(err);
  });
};

module.exports = {
  start: go
};

Wenn ich also server.js hochfahre, gebe ich undefined in der console.log (Antwort) zurück, wenn ich tatsächlich das Array zurückgeben möchte, zu dem ich gedrängt habe, kannst du sehen, wo ich falsch liege?


5
2017-11-17 00:52


Ursprung


Antworten:


Du brauchst return etwas von deinem async Funktion (eine Rückkehr in a kommt dann nicht von der Hauptfunktion zurück). Entweder ein Versprechen oder etwas Sie await-ed.

Stellen Sie außerdem sicher, dass Sie Ihre Anmeldung bestätigen go Variable, um zu vermeiden, dass sie in den globalen Raum gelangt.

const go = async () => {

  const options = {
    uri: "http://www.somewebsite.com/something",
    transform: function(body) {
      return cheerio.load(body);
    }
  };

  return request(options)
    .then($ => {
      let scrapeTitleArray = [];
      $(".some-class-in-html").each(function(i, obj) {
        const data = $(this)
          .text()
          .trim();
        scrapeTitleArray.push(data);
      });
      return scrapeTitleArray;
    })
    .catch(err => {
      console.log(err);
    });
};

Da Sie ein verwenden async Funktion, möchten Sie vielleicht die Vorteile der await Syntax auch.

const go = async () => {

  const options = {
    uri: "http://www.somewebsite.com/something",
    transform: function(body) {
      return cheerio.load(body);
    }
  };

  try {
    const $ = await request(options);
    $(".some-class-in-html").each(function(i, obj) {
      const data = $(this)
        .text()
        .trim();
      scrapeTitleArray.push(data);
    });
    return scrapeTitleArray;
  }
  catch (err) {
    console.log(err);
  }
};

6
2017-11-17 00:58



Ich glaube dir go Die Funktion gibt keinen Wert zurück.

Du rufst an request(options).then(...), aber was aus dieser Verheißung folgt, kommt niemals zurück go. Ich empfehle Ihnen, eine hinzuzufügen return Erklärung:

go = async () => {

  const options = {
    uri: "http://www.somewebsite.com/something",
    transform: function(body) {
      return cheerio.load(body);
    }
  };

  // The only difference is that it says "return" here:
  return request(options)
    .then($ => {
      let scrapeTitleArray = [];
      $(".some-class-in-html").each(function(i, obj) {
        const data = $(this)
          .text()
          .trim();
        scrapeTitleArray.push(data);
      });
      return scrapeTitleArray;
    })
    .catch(err => {
      console.log(err);
    });
};

0
2017-11-17 00:58