对数据执行一系列查询,允许失败

时间:2013-04-07 16:50:46

标签: javascript error-handling

我有一些数据需要查询以找到最佳匹配。所以我在函数内部传递了el(数据)。

function match(el) {
  return el.find('link:regex(type,application\\/(atom|rss)\\+xml)').attr('href')
    || el.find('meta[name="msapplication-task"]').attr('content').match(/action-uri=(.*?);/)[1]
    || [another query]
    || [another query]
    || [last resort query]
}

使用||运算符时遇到的问题是,如果任何一个查询导致错误,操作将退出,并且后面的查询都不会匹配。例如,第二个查询可能会失败,因为match上没有undefined方法,如果没有找到值。

我目前已在try语句中包含此函数调用以捕获这些错误,但这并不能解决我的问题。我需要捕获每个查询的错误,或其他东西,以允许其余的查询运行。

我正在寻找一种优雅的解决方案来针对这些数据运行一组查询。要匹配的第一个查询应该是返回值。

1 个答案:

答案 0 :(得分:1)

这样的事情会好吗?必须检查返回值和所有...

参见jsFiddle:http://jsfiddle.net/vGd46/2/

编辑:大致使用jQuery

var queries = [
    function(el){return el.find('link:regex(type,application\\/(atom|rss)\\+xml)').attr('href')},
    function(el){return el.find('meta[name="msapplication-task"]').attr('content').match(/action-uri=(.*?);/)[1]}
];
function match(el) {
    var l = queries.length,
        m = false; // match
    while(-1 < --l && !m){
        try{
            m = queries[i](el);
        } catch(err) {
            alert(err);
            // handle
        }
    }
    return m;
}

var el = document.createElement("meta");
el.setAttribute('name','msapplication-task');
el.setAttribute('content','action-uri="one";action-uri="two";');

alert(match($('<div/>').append(el)));

编辑:循环前进(小提琴:http://jsfiddle.net/vGd46/3/

function match(el) {
    var l = queries.length,
        i = -1,
        m = false; // match
    while(++i < l && !m){
        try{
            m = queries[l](el);
        } catch(err) {
            alert(err);
            // handle
        }
    }
    return m;
}