0

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

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

4

4 回答 4

1

更新:正如@phant0m 所指出的,您没有从 中返回任何值urlExists,两个返回语句都是传递给 ajax 调用的回调方法的一部分。所以你urlExists()总是返回 undefined 导致if条件失败。

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

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

在这种情况下,我们可以更改urlExists为接受下面给出的回调函数,并true根据falseajax 调用的结果调用回调。

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){
    }
})
于 2013-05-15T15:42:34.713 回答
1

urlExists函数根本没有return语句(因此它总是会返回undefined)。

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

如果您想对正在处理的 ajax 响应做出反应,那么您必须在事件处理程序中执行此操作。你不能返回给调用者,因为它已经完成并消失了。

可以在这个问题的答案中找到对此的扩展解释。您的示例不关心返回实际数据,但原理是相同的。

于 2013-05-15T15:43:34.910 回答
0

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

于 2013-05-15T15:43:56.903 回答
0

您的呼叫正在异步执行。第一个函数创建 ajax 调用并添加成功和错误处理程序,然后立即完成。由于第一个函数中没有 return 语句,所以它返回undefined. 成功回调在行执行后var rm = true;执行。您应该使用回调从函数中获取结果。

于 2013-05-15T15:45:34.487 回答