Node.js 使用承诺:承诺 returns 什么都不做
Node.js using Promises : Promise returns nothing
我正在开发一个简单的网络抓取工具,我可以在其中抓取 actor/actress 个名称,但出现错误。你能看看吗,我想我做错了什么。
它returns [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");
}
}
});
}());
}
});
你这里有误:
// 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);
});
});
}
关于 promises 的一件事是它们会为您捕获错误,因此如果您有错误处理程序并且您的代码没有按预期工作,您应该始终记录错误路径以查看是否有错误路径被击中。如果您的代码中没有定义错误处理程序,您应该设置一个并记录它。
记录异步操作中的错误对于调试非常重要,因为异步代码中的错误(甚至异常)通常不会自动显示在控制台中。因此,您通常必须自己记录它们才能知道它们正在发生。
我正在开发一个简单的网络抓取工具,我可以在其中抓取 actor/actress 个名称,但出现错误。你能看看吗,我想我做错了什么。
它returns [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");
}
}
});
}());
}
});
你这里有误:
// 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);
});
});
}
关于 promises 的一件事是它们会为您捕获错误,因此如果您有错误处理程序并且您的代码没有按预期工作,您应该始终记录错误路径以查看是否有错误路径被击中。如果您的代码中没有定义错误处理程序,您应该设置一个并记录它。
记录异步操作中的错误对于调试非常重要,因为异步代码中的错误(甚至异常)通常不会自动显示在控制台中。因此,您通常必须自己记录它们才能知道它们正在发生。