返回一个带有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选择器是错误的)地图函数/请求继续做的工作,它返回我的错误(或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);
}
相关文章:
- Promise没有;t返回对象的数组
- $q.all当输入数组中的一项不是promise时,Typescript检查器失败
- 当数组中的某个函数没有返回promise时,我可以使用$q.all吗
- promise数组中的WinJS返回
- 使用Node中的Q promise库对值数组顺序调用/执行相同的函数;并返回带有结果的新数组/集合
- 序列promise链与数组数据,如何解析promise链
- Promise和Promise.all(数组)在数组实现之前执行
- 如果数组中的值为false,则破坏Promise
- 在多维数组中获取promise的结果
- 在使用promise数组时使用jQuery
- 包含 promise 的对象数组在 for 循环中混乱
- ngResource.myfunc().$promise.then 返回空数组
- ES6 Promise.all() promise 数组的奇怪分辨率
- 如何使用 Parse.promise javascript 定义一个承诺数组并获取结果数组 [parse.com]
- 节点.js不能使用 promise、Mongoose 和 GET 请求推送到全局数组
- 将一个q promise数组拆分为多个数据包,并依次运行这些数据包
- $when.apply在promise数组中的某个promise被延迟时不工作
- 在PouchDB/Barket.js中推送promise数组之前修改对象的值
- 为什么,如果“$q.all”没有返回一个promise数组,则是一个未抛出的异常
- 当promise数组的长度不确定时,Q.js Q.all()