我正在尝试加载HTML文件,在里面搜索字符串,如果找不到,请加载另一个文件并重复该过程(总共大约5-6个文件)。
以下是我进一步说明的过程:
我一直试图围绕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文件中搜索字符串,如果找不到,则加载另一个文件?
答案 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")} );
答案 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
});