使用 promise 将错误作为数组对象值返回
Returning error as an array object value with promise
我正在使用抓取函数从数组中列出的一堆 urls
中获取一些数据。这是以下功能:
function getNbShares(urls) {
return Promise.map(urls, request).map((htmlOnePage, index) => {
const $ = cheerio.load(htmlOnePage),
share = $('.nb-shares').html();
return {
url: urls[index],
value: share
};
}).catch(function (urls, err) {
return {
url: urls[index],
value: err
};
});
}
它工作正常,但错误处理不是。我想要的是,当我遇到错误时(要么是因为页面未加载,要么是 DOM 选择器错误)地图 function/request 继续做的是工作,它 returns我将错误(或 null)作为附加到最终数组对象中的 url 的值。
我想你只是想早点在映射函数中做那个处理;而且我认为您可以避免进行两个单独的映射操作;看评论:
function getNbShares(urls) {
return Promise.map(
urls,
url => request(url)
.then(htmlOnePage => { // Success, so we parse
const $ = cheerio.load(htmlOnePage), // the result and return
value = $('.nb-shares').html(); // it as an object with
return { url, value }; // `url` and `value` props
})
.catch(error => ({url, error})) // Error, so we return an
// object with `url` and
// `error` props
}
);
}
(我假设您使用的是 ES2015+,因为您使用的是箭头函数。)
我可能会选择考虑其中的一部分:
function getNbSharesFromHTML(html) {
const $ = cheerio.load(html);
return $('.nb-shares').html();
}
function getNbShares(urls) {
return Promise.map(
urls,
url => request(url)
.then(htmlOnePage => ({url, value: getNbSharesFromHTML(htmlOnePage)))
.catch(error => ({url, error}))
}
);
}
可能更小的部分:
function getNbSharesFromHTML(html) {
const $ = cheerio.load(html);
return $('.nb-shares').html();
}
function getNbSharesFromURL(url) {
return request(url)
.then(htmlOnePage => ({url, value: getNbSharesFromHTML(htmlOnePage)))
.catch(error => ({url, error}));
}
function getNbShares(urls) {
return Promise.map(urls, getNbSharesFromURL);
}
我正在使用抓取函数从数组中列出的一堆 urls
中获取一些数据。这是以下功能:
function getNbShares(urls) {
return Promise.map(urls, request).map((htmlOnePage, index) => {
const $ = cheerio.load(htmlOnePage),
share = $('.nb-shares').html();
return {
url: urls[index],
value: share
};
}).catch(function (urls, err) {
return {
url: urls[index],
value: err
};
});
}
它工作正常,但错误处理不是。我想要的是,当我遇到错误时(要么是因为页面未加载,要么是 DOM 选择器错误)地图 function/request 继续做的是工作,它 returns我将错误(或 null)作为附加到最终数组对象中的 url 的值。
我想你只是想早点在映射函数中做那个处理;而且我认为您可以避免进行两个单独的映射操作;看评论:
function getNbShares(urls) {
return Promise.map(
urls,
url => request(url)
.then(htmlOnePage => { // Success, so we parse
const $ = cheerio.load(htmlOnePage), // the result and return
value = $('.nb-shares').html(); // it as an object with
return { url, value }; // `url` and `value` props
})
.catch(error => ({url, error})) // Error, so we return an
// object with `url` and
// `error` props
}
);
}
(我假设您使用的是 ES2015+,因为您使用的是箭头函数。)
我可能会选择考虑其中的一部分:
function getNbSharesFromHTML(html) {
const $ = cheerio.load(html);
return $('.nb-shares').html();
}
function getNbShares(urls) {
return Promise.map(
urls,
url => request(url)
.then(htmlOnePage => ({url, value: getNbSharesFromHTML(htmlOnePage)))
.catch(error => ({url, error}))
}
);
}
可能更小的部分:
function getNbSharesFromHTML(html) {
const $ = cheerio.load(html);
return $('.nb-shares').html();
}
function getNbSharesFromURL(url) {
return request(url)
.then(htmlOnePage => ({url, value: getNbSharesFromHTML(htmlOnePage)))
.catch(error => ({url, error}));
}
function getNbShares(urls) {
return Promise.map(urls, getNbSharesFromURL);
}