我有这个函数来测试是否加载了脚本:
function urlExists(url){
$.ajax({
url: url,
success: function(data){
//alert(url + ' exists');
console.log(url + ' exists');
return true
},
error: function(data){
//alert(url + ' failed to load');
console.log(url + ' failed to load');
return false
}
});
}
然后我以这种方式称呼它:
if (urlExists('file.js')) {
var rm = true;
}
但即使我得到了url存在的console.log,我的var rm仍未定义。
我尝试使用Arun P Johny的解决方案:
urlExists('file.js', function(result){
if(result){
rm = true;
}
});
但即使file.js存在,rm仍未定义,我得到的控制台日志就是这样。
答案 0 :(得分:1)
更新:
正如@ phant0m指出的那样,你没有从urlExists
返回任何值,返回语句都是传递给ajax调用的回调方法的一部分。因此,urlExists()
始终返回undefined,导致if
条件失败。
因为urlExists
使用异步的ajax调用意味着一旦将请求发送到服务器urlExists
方法,就会返回undefined
导致if条件失败。
在这种情况下,解决方案是使用一个回调方法,一旦异步任务完成,它将与结果一起执行。
在这种情况下,我们可以更改urlExists
以接受下面给出的回调函数,并使用true
或false
调用回调,具体取决于ajax调用的结果。
function urlExists(url, callback){
$.ajax({
url: url,
success: function(data){
//alert(url + ' exists');
console.log(url + ' exists');
callback(true)
},
error: function(data){
//alert(url + ' failed to load');
console.log(url + ' failed to load');
callback(false)
}
});
}
然后
urlExists('file.js', function(result){
if(result){
}
})
答案 1 :(得分:1)
urlExists
函数根本没有return
语句(因此它将始终返回undefined
)。
执行的功能是分配给ajax处理程序的事件处理程序。在收到HTTP响应之后,它们甚至不会触发,这将在urlExists
函数运行完毕后返回,并返回它将返回的任何内容。
如果您想对正在处理的ajax响应做一些反应,那么您必须在事件处理程序中执行此操作。你无法返回呼叫者,因为它已经完成并消失了。
可以在this question的答案中找到对此的扩展说明。您的示例并不关心返回实际数据,但原则是相同的。
答案 2 :(得分:0)
success
和error
函数是回调方法。它们不是函数urlExists
的一部分。相反,它们是传递给$.ajax
的参数的一部分。
答案 3 :(得分:0)
您的通话是异步执行的。第一个函数创建ajax调用并添加成功和错误处理程序,然后立即完成。由于第一个函数中没有return语句,因此返回undefined
。执行行var rm = true;
后执行成功回调。您应该使用回调来获取函数的结果。