This question already has answers here:
How do I return the response from an asynchronous call?
                            
                                (38个答案)
                            
                    
                6年前关闭。
        

    

我有这个功能来测试是否加载了脚本:

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仍然是未定义的,并且我得到了表明这样的控制台日志。

最佳答案

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

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

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

在这种情况下,我们可以更改urlExists以接受如下所示的回调函数,并根据ajax调用的结果使用truefalse调用回调。

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){
    }
})

10-02 18:10