javascript - 使用 Promise 将错误作为数组对象值返回

标签 javascript error-handling promise bluebird

我正在使用抓取函数从数组内列出的一堆 url 中获取一些数据。这是以下函数:

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 选择器错误), map 函数/请求继续执行工作,并将错误(或 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);
}

关于javascript - 使用 Promise 将错误作为数组对象值返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39751906/

相关文章:

javascript - Meteor - loginWithPassword 成功后什么也不做

AngularJS。在服务中解决 promise 后如何更新指令?

javascript - 如何用 Promises 写这个?

javascript - 仅当已选中时才单击复选框

javascript - Mapbox GL - 绘制多个点/符号并为其设置动画

javascript - 如何停止实时ajax搜索栏上的输入重置

error-handling - “This XML file does not appear to have any style information”

error-handling - 未找到 Orchard 返回页面

java - 无法调试 Controller 错误

javascript - 如何对依赖于 Promise 的 AngularJS Controller 进行单元测试?