2015-02-11 62 views
0

首先我读了this question,我发现它非常有用。jQuery检查url响应

我想检测一个url是否响应。如果是这样,那么使用这个URL并启动另一个函数,如果为false,则创建一个新的url并启动其他函数。

我试图从上面提到的问题实现代码,但我发现很难将它合并到我的代码中,因为我不明白他试图用callback提及什么。

所以我是有两个功能:

function relatedProducts(relatedUrl){ 
    $.getJSON(relatedUrl, function(data){ 
    ...... 
    }); 
} 
function liveSearch(liveSearchUrl){ 
    $.getJSON(liveSearchUrl, function(data){ 
    ...... 
    }); 
} 

而且我有一个变量url和我想要测试,如果该URL 响应所以不是它是否有效。

var url ='apple/i-phone/iphone5'; 

function urlExists(url, exists){ 
$.ajax({ 
    type: 'HEAD', 
    url: url, 
    success: function(){ 

     // what do I have to do here??? 
     Poster is mentioning `callback` but which one?? 
     }, 
     error: function(){ 

     // what do I have to do here??? 
     Poster is mentioning `callback` but which one?? 
     } 
    }); 
    } 

    urlExists(url, function(exists){ 
    if(true){ 
    var relatedUrl = ?? 
    relatedProducts(relatedUrl); 
    } else { 
    var liveSearchUrl = ?? 
    liveSearch(liveSearchUrl); 
    }); 

我还在学习jQuery和我的海报,他的回答很困惑;)

任何帮助极大的赞赏。

+0

* callback *是传递到您的AJAX调用中的函数,它将在响应中运行。 '$ .getJSON(liveSearchUrl,function(data){' - 'function(data)'是回调函数的开始,并且在getJSON数据调用返回后执行它 – tymeJV 2015-02-11 14:46:23

+0

@tymeJV:Ok thx,但我知道什么是回调只是我不知道如何在提到的帖子海报使用它。你有任何想法? – Meules 2015-02-11 14:54:23

回答

1

AJAX是异步的,所以调用AJAX方法是非阻塞的。所以当控制流返回给调用者时,不能期望AJAX方法的任何结果可用,并且随后的函数调用不应该依赖完成的AJAX调用。

简单的例子:

doSomeStuff($.ajax(...)); //doesn't work 

其他例如:

var x = false; 
$.ajax({ 
    url: url, 
    success: function(){ 
     x = true; 
    } 
}); 
if (x) { 
    // probably doesn't work 
} 

这就是回调函数有:你可以告诉一个AJAX方法的调用做一些东西,一旦它完成。这些是你的例子中的successerror参数。

现在为您的具体示例。我意识到你从类似问题的答案中复制了大部分内容,但我发现它有几个问题,其中包括你使用的if (true),这不是你想要的,所以这里是我改善代码的方法:

首先,我们需要2个回调而不是1个回调,不需要强制一种方法来完成明确意图由两种不同方法处理的方法。

var successCallback = function() { 
    var relatedUrl = '' // see note below code block 
    relatedProducts(relatedUrl); 
}  
var errorCallback = function() { 
    var liveSearchUrl = ''// see note below code block 
    liveSearch(liveSearchUrl); 
} 

接下来,让我们改变你的urlExists

function urlExists(url, sCallb, eCallb){ 
    $.ajax({ 
    type: 'HEAD', 
    url: url, 
    success: sCallb, 
    error: eCallb 
    }); 
} 

最后,你这是怎么把这些拼凑:

var url ='apple/i-phone/iphone5'; 
urlExists(url,successCallback,errorCallback); 

一些注意事项:

如果你想relatedUrlliveSearchUrl与使用的URL相同r ajax电话,让我知道,我会相应地改变我的例子。如果没有,只需要在引号内使用你想使用的url。

当然,urlExists是一个甚至不需要的包装器,您可以直接在AJAX调用中使用您的url和回调函数,但这样看起来更清晰,更容易理解并且更加可重用。

此代码将执行errorCallback代码为ANY错误,如果没有错误发生,则代码为successCallback。这实际上可能不是你想要的,特别是如果你认为AFAIK 3xx状态码被认为是错误的话。为了获得更好的控制,你可以为每个状态码定义回调,或者只是为其中的一些状态码定义回调,如果你想我可以更新我的例子,请告诉我。

+0

对不起,我很晚回复:)它的工作原理后一些摆动.. – Meules 2015-02-18 23:09:30

0

Callback不过是函数返回的值。

当OP指示callback,在ans的解释中,他引用返回值的地址。

例如:在var a = '10'a是地址和10是存储在它的值。

现在考虑的功能b()返回某个值:

function b(){ 
var a ='a'; 
return a; 
} 

var something = b(); // here **something** can be seen as callback of b() 

现在来到你的观点时,OP使用单词callback在这个code他所指的只是一个变量。您可以用test,abc等任何工作替换callback这个词,它仍然会产生相同的结果。

希望这有助于

0

请检查this.It同样喜欢打头。

var callback = function (x){ 
     if(x) 
      alert ("You can make real call to this url"); 
     else 
      alert ("Somthing worng"); 
     }; 

$.ajax({ 
     type: 'HEAD', 
     url: "/echo/json", 
     success: function() { 
      callback(true); 

     }, 
     error: function() { 
      callback(false); 
     }    
    }); 

http://jsfiddle.net/PK76X/152/