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]
}

演算子を使用する際の問題||は、いずれかのクエリでエラーが発生した場合、操作が終了し、その後のクエリが一致しないことです。たとえば、値が見つからない場合、matchメソッド onがないため、2 番目のクエリは失敗する可能性があります。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)));

EDIT : ループ転送 (フィドル: 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 に答える