Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我的函数没有返回true?_Javascript_Jquery - Fatal编程技术网

Javascript 为什么我的函数没有返回true?

Javascript 为什么我的函数没有返回true?,javascript,jquery,Javascript,Jquery,我有一个测试脚本是否加载的函数: function urlExists(url){ $.ajax({ url: url, success: function(data){ //alert(url + ' exists'); console.log(url + ' exists'); return true }, error: function(data){ //alert(u

我有一个测试脚本是否加载的函数:

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;
    }
});
但是rm仍然没有定义,即使file.js存在,并且我得到了控制台日志,上面有这样的说明。

更新: 正如@phant0m指出的,您没有从
urlExists
返回任何值,这两个返回语句都是传递给ajax调用的回调方法的一部分。因此,您的
urlExists()
始终返回未定义,从而导致
if
条件失败

因为
urlExists
使用了一个ajax调用,它本质上是异步的,这意味着一旦请求被发送到服务器
urlExists
方法存在,返回
undefined
,就会导致if条件失败

在这种情况下,解决方案是使用回调方法,该方法将在异步任务完成后随结果一起执行

在这种情况下,我们可以改变
urlExists
以接受下面给出的回调函数,并根据ajax调用的结果使用
true
false
调用回调

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
函数根本没有
return
语句(因此它总是返回
未定义的

执行的函数是分配给ajax处理程序的事件处理程序。它们甚至不会在收到HTTP响应之前触发,而HTTP响应将在
urlExists
函数完成运行并返回它将返回的任何内容之后触发

如果您想对正在处理的ajax响应做出反应,那么必须在事件处理程序中进行。您无法返回到调用方,因为它将完成并消失


关于这一点的详细解释可以在对的答复中找到。您的示例并不关心返回实际数据,但原则是相同的。

函数
success
error
都是回调方法。它们不是函数
urlExists
的一部分。相反,它们是传递给
$的参数的一部分。ajax

您的调用是异步执行的。第一个函数创建ajax调用并添加成功和错误处理程序,然后立即完成。由于第一个函数中没有return语句,因此它返回
未定义的
。成功回调在行
var rm=true之后执行被执行。您应该使用回调函数从函数中获取结果。

ajax是否异步无关紧要。即使它是同步的,也不会工作,因为
return
语句根本没有连接到urlExists函数。否则,很好的帖子。@phant0m很抱歉错过了这一点,更新应该修复问题+1,因为
urlExists函数根本没有return语句。
所有其他函数都错过了明显而重要的一点。
urlExists('file.js', function(result){
    if(result){
    }
})