2

我有一些数据需要查询以找到最佳匹配。所以我在一个函数内部有这个,它被传递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]
}

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

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

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

4

1 回答 1

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;
}
于 2013-04-07T17:02:20.327 回答