首先,我读了this question,我发现它非常有用。
我试图检测网址是否响应。如果是,那么使用此URL并启动另一个函数,如果为false,则创建一个新的url并启动另一个函数。
我尝试从上面提到的问题中实现代码,但我发现很难将其合并到我的代码中,因为我不明白他试图用callback
提到的内容。
所以我所拥有的是两个功能:
function relatedProducts(relatedUrl){
$.getJSON(relatedUrl, function(data){
......
});
}
function liveSearch(liveSearchUrl){
$.getJSON(liveSearchUrl, function(data){
......
});
}
此外,我有一个可变网址,我试图测试该网址是否响应,如果它有效则不会。
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 :(得分: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方法的调用。这些是您示例中的success
和error
参数。
现在举个具体的例子。我发现你把大部分内容都从一个类似问题的答案中复制了,但是我发现它有几个问题,除了你使用if (true)
之外,这不是你想要的,所以这里是我的注意改进代码:
首先,我们需要2个回调而不是1回调,没有必要强制一个方法去做那些明显意图由2种不同方法处理的方法。
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);
一些注意事项:
如果您希望relatedUrl
和liveSearchUrl
与用于ajax调用的网址相同,请告诉我,我会相应更改我的示例。如果没有,只需将您想要使用的网址放在引号内。
当然,urlExists是一个甚至不需要的包装器,你可以直接在AJAX调用中使用你的url和回调,但这样看起来更干净,更容易理解而且更加可重复使用。
此代码将针对 ANY 错误执行errorCallback
,如果未发生错误,则执行successCallback
。这实际上可能不是您想要的,特别是如果您认为AFAIK 3xx状态代码被视为错误。为了获得更好的控制,你可以为每个状态代码定义回调,或者只为其中一些定义回调,如果你想我可以更新我的例子,请告诉我。
答案 1 :(得分: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在code中使用单词callback
时,他只是提到变量。您可以将callback
替换为test
,abc
等任何作品,但仍会产生相同的效果。
希望这有帮助
答案 2 :(得分:0)
请检查一下。就像nob一样。
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);
}
});