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

时间:2013-05-15 15:41:39

标签: javascript jquery

我有这个函数来测试是否加载了脚本:

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仍未定义,我得到的控制台日志就是这样。

4 个答案:

答案 0 :(得分:1)

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

因为urlExists使用异步的ajax调用意味着一旦将请求发送到服务器urlExists方法,就会返回undefined导致if条件失败。

在这种情况下,解决方案是使用一个回调方法,一旦异步任务完成,它将与结果一起执行。

在这种情况下,我们可以更改urlExists以接受下面给出的回调函数,并使用truefalse调用回调,具体取决于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)

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

答案 3 :(得分:0)

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