【问题标题】:Node.js using Promises : Promise returns nothingNode.js 使用 Promises :Promise 不返回任何内容
【发布时间】:2015-11-29 18:43:32
【问题描述】:

我正在开发一个简单的网络抓取工具,用于抓取演员/女演员的姓名,但出现错误。请你检查一下,我觉得我做错了什么。

返回[ReferenceError: options2 is not defined] 错误。

非工作版本(使用 Promises)

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

// create promisified version of request()
function requestPromise(options) {
  return new Promise(function (resolve, reject) {
    request(options2, function (err, resp, body) {
      if (err) return reject(err);
      resolve(body);
    });
  });
}

app.get('/fetch', function (req, res) {
  var promises = [];
  var headers = {
    'User-Agent': req.headers['user-agent'],
    'Content-Type': 'application/json; charset=utf-8'
  };
  for (var i = 1; i < 10; i++) {
    promises.push(requestPromise({url: "http://example.com/person/" + i + "/personname.html", headers: headers}));
  }
  Promise.all(promises).then(function (data) {
    // iterate through all the data here
    for (var i = 0; i < data.length; i++) {
      if ($ = cheerio.load(data[i])) {
        var links = $("#container");
        var name = links.find('span[itemprop="name"]').html(); // name
        if (name == null) {
          console.log("null name returned, do nothing");
        } else {
          name = entities.decodeHTML(name);
          console.log(name); // it doesn't echo the name, WHY?
        }
      } else {
        console.log("can't open");
      }
    }
  }, function (err) {
    // error occurred here
       console.log(err);
  });
});

工作版本(丑陋且不按顺序,这就是我尝试进入 Promises 的原因)

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

app.get('/back', function (req, res) {
  for (var y = 1; y < 10; y++) {
    (function () {
          const id = y;
          var url = "http://example.com/person/" + id + "/personname.html";
          var options2 = {
          url: url,
        headers: {
          'User-Agent': req.headers['user-agent'],
          'Content-Type': 'application/json; charset=utf-8'
        }
      };
      request(options2, function (err, resp, body) {
        if (err) {
          console.log(err);
        } else {
          if ($ = cheerio.load(body)) {
                var links = $('#container');
            var name = links.find('span[itemprop="name"]').html(); // name
            if (name == null) {
              console.log("null name returned, do nothing");
            } else {
              name = entities.decodeHTML(name);
              console.log(name); // it echoes name, so it works.
            }
          }
          else {
            console.log("can't open");
          }
        }
      });
    }());
    }
});

【问题讨论】:

  • 是否遇到错误?
  • 这是基本的 Javascript 调试,用于跟踪您得到的响应以及为什么它不遵循您想要的代码路径。我会说首先将console.log(err) 放在Promise.all().then() 处理程序的错误分支中。如果您的任何请求返回错误,Promise.all() 将转到错误处理程序。如果这没有显示任何内容,请在 Promise.all().then() 处理程序中执行 console.log(data) for 循环,以准确查看您到达那里的内容。或者,您可以在 Promise.all().then() 处理程序的两个分支中设置断点,然后单步执行。
  • 我编辑了问题详情,感谢您的帮助。

标签: node.js promise cheerio


【解决方案1】:

你这里有一个错误:

// create promisified version of request()
function requestPromise(options) {
  return new Promise(function (resolve, reject) {
    request(options2, function (err, resp, body) {
      if (err) return reject(err);
      resolve(body);
    });
  });
}

您指的是options2,但参数名为options。

改成这样:

// create promisified version of request()
function requestPromise(options) {
  return new Promise(function (resolve, reject) {
    request(options, function (err, resp, body) {
      if (err) return reject(err);
      resolve(body);
    });
  });
}

从中学到的关于 Promise 的一件事是,它们会为您捕获错误,因此,如果您有错误处理程序并且您的代码没有按预期工作,您应该始终记录错误路径以查看是否有错误路径.如果您的代码中没有定义错误处理程序,您应该设置一个并记录它。

在异步操作中记录错误对于调试至关重要,因为异步代码中的错误(甚至异常)通常不会自动显示在控制台中。因此,您通常必须自己记录它们才能知道它们正在发生。

【讨论】:

  • 再次感谢您。
猜你喜欢
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 2020-07-11
  • 2014-03-24
  • 2019-01-14
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
相关资源
最近更新 更多