$ .ajax加载另一个文件,如果在第一个文件中找不到字符串

时间:2012-03-24 15:20:52

标签: jquery jquery-deferred

我正在尝试加载HTML文件,在里面搜索字符串,如果找不到,请加载另一个文件并重复该过程(总共大约5-6个文件)。

以下是我进一步说明的过程:

  1. 加载 file1.html
  2. 搜索字符串
  3. 如果找到,请告诉用户(并结束流程)
  4. 如果找不到,请转到下一个文件,然后使用 file2.html
  5. 重复步骤1

    我一直试图围绕AJAX调用的jQuery Deferred对象。简单来说,到目前为止我想出的是解决主延迟对象(mainDef)如果找到了字符串 - 这可能会阻止脚本加载第二个文件,因为没有必要。 / p>

    否则(即如果在第一个文件中找不到该字符串),它将加载第二个文件。然后是第三个,依此类推。

    这是我的代码:

    // var $q = string to be searched
    // resolved when answer found
    var mainDef = $.Deferred();
    // resolved when not found in one day
    var dayDef = $.Deferred();
    
    $.ajaxSetup({
        success: function(data) {
            var $result = $(data).find("td:contains('"+ $q +"')");
            if ($result.length !== 0) {
                mainDef.resolve();
                return data;
            }
            else {
                return false;
            }
        },
        dataType: 'html',
    });
    
    function one() {
        return $.ajax({
            url: 'one.html'
        });
    }
    
    function two() {
        return $.ajax({
            url: 'two.html'
        });
    }
    
    $.when( one(), two() ).then(
        // success
        function(data) {
            var $result = $(data).find("td:contains('"+ $q +"')");
            // found it
            if ($result.length !== 0) {
                $success.removeClass('hidden');
            }
            else {
                $error.removeClass('hidden');
            }
        },
        // fail
        function () {
            alert("Promise failed");
        }
    );
    

    问题是,我无法阻止第二个AJAX请求通过,这让我感到困惑,因为在$.when() / .then()块中,成功回调不是'获取响应文本(在变量data中。

    我不太确定这是否是一个概念问题或技术问题。我意识到我需要运行2级延迟对象,也许。如果找到了字符串,它将解析主级别并退出脚本,如果没有找到,它将解决在继续主级别时延迟的“较低级别”。

    所以我的问题是:如何在AJAX文件中搜索字符串,如果找不到,则加载另一个文件?

2 个答案:

答案 0 :(得分:1)

这样的事情可以回答你的问题:构建一个自定义延迟,逐个检查文件,如果条件满足则将延迟标记为已解决,如果所有文件都失败,则将延迟标记为已拒绝。

var urls=["one.html","two.html","three.html"];

function Finder(urls) {
    var dfd=jQuery.Deferred();

    function fetchUrl(url) {
        return jQuery.ajax({
            url: url
        });
    }

    function parseMatch(res) {
        // that would be the actual parsing
        // a bit of randomness instead
        return (Math.round(Math.random())) ? true:false;
    }

    function getMatch() {
        if (dfd.state()!=="pending") //problem already solved
            return;
        if (urls.length==0) { // no more url to check
            dfd.reject(); // we did not find a match
            return;
        }

        // let's try the next url
        fetchUrl(urls.shift()).
            pipe(parseMatch,getMatch). // and filter the result
            done(function(found) { //file loaded and parsed
                if (found)
                    dfd.resolve();
                else
                    getMatch();
            });
    }
    getMatch();
    return dfd.promise();
}

var f=Finder(urls);
f.done( function() {console.log("found")} );
f.fail( function() {console.log("not found")} );

http://jsfiddle.net/RnhfG/

答案 1 :(得分:0)

.pipe()是你的朋友:

function testData(data) {
    return $(data).find( "td:contains('"+ $q +"')" ).length
        ? data
        : $.Deferred().reject( $q + " not found" );
}

function find( urls ) {
    return $.ajax( urls[ 0 ] )
        .pipe( testData )
        .pipe( null, urls.length > 1 && function() {
            return find( urls.slice( 1 ) );
        }); 
} 

find( [ "one.html", "two.html", "three.html" ] ).done(function() {
    // FOUND
}).fail(function() {
    // NOT FOUND
});