Javascript jQuery延迟不工作
我正在尝试一个代码作为Javascript jQuery延迟不工作,javascript,jquery,ajax,jquery-deferred,Javascript,Jquery,Ajax,Jquery Deferred,我正在尝试一个代码作为 function search(query) { var dfr = $.Deferred(); $.ajax({ url: "http://search.twitter.com/search.json", data: { q: query }, dataType: 'jsonp', success: dfr.resolve }); re
function search(query) {
var dfr = $.Deferred();
$.ajax({
url: "http://search.twitter.com/search.json",
data: {
q: query
},
dataType: 'jsonp',
success: dfr.resolve
});
return dfr.promise();
}
Test = {
start: function(){
alert("Starting");
}
};
function gotresults(data) {
alert(data.max_id);
}
function showDiv() {
$('<div />').html("Results received").appendTo('body');
}
$.when(search('ashishnjain'))
.then(gotresults)
.then(showDiv);
它只是提醒“开始”和终止。可以在中找到一个工作示例。我做错了什么?
Test
不是一个测试,所以它没有方法.when()
是a,因此当您调用.when()
时,它可以工作
您的$.ajax()
调用是a,因此如果您在'Test.start()
方法中返回该调用,您可以添加回调(),一旦ajax调用得到解决,即返回其数据,就会调用回调,但是我认为这并不是延迟对象的正确用法。以下是我认为它的用途:
function searchTwitter(query){
$.ajax({
url: "http://search.twitter.com/search.json",
data: {
q: query
},
dataType: 'jsonp',
success: function(data){return data;}
})
.then(gotresults)
.then(showDiv)
.fail(showFailDiv);
};
function gotresults(data) {
alert(data.max_id);
}
function showDiv() {
$('<div />').html("Results received").appendTo('body');
}
function showFailDiv() {
$('<div />').html("Results <b>NOT</b> received").appendTo('body');
}
// Starting can be done with a click:
$("#searchTwitter").click(function(){
searchTwitter($("#searchName").val());
});
// OR a static call:
searchTwitter("ashishnjain");
更新以回答评论: 在中,您没有告诉延迟对象失败,因此它永远不会调用
.fail()
回调。要纠正这一点,如果.fail()
(错误:….
)通知延迟对象发生故障,请使用ajax解释错误:drf.reject
-这将运行.fail()
回调
至于您看到直接运行的ShowMoreCode()
的原因是,.then()
调用是回调,如果您将函数的字符串表示形式传递给它,如:,那么(ShowDiv)
一旦轮到它,回调将查找具有该名称的函数。如果将调用传递给函数,则(someMoreCode('Ashish')
它将运行该函数。尝试一下,将。然后(showDiv)
更改为。然后(showDiv())
您会注意到,只要代码运行,它就会显示showDiv()
中的代码
如果将.then(ShowMoreCode('Ashish'))
更改为。然后(ShowMoreCode)
,则可以从$.ajax()调用中访问返回的数据。像这样:
function someMoreCode(name) {
alert('Hello ' + name.query);
}
看看这里:start()
没有返回任何东西,所以我猜你不能在这里使用链接。即使将搜索放入测试并从搜索开始也没有帮助。test
只是没有相应的方法。你看过firebug/webinspector吗?谢谢,还是详细的回复。但是,在尝试了上面的代码之后,我发现仍然没有调用failed。我甚至把网址改成了,但是运气不好。我在这段代码中注意到的另一点是,someMoreCode函数甚至在搜索代码之前就被调用了。难道我们不能在所有代码完成后链接更多的代码来执行吗?请参阅答案的更新,希望这对您的代码有所帮助。再次感谢您的详细解释。但是,您更新的响应意味着我们无法将自定义函数与与与链的ajax调用无关的自定义值连接起来。someMoreCode(“Ashish”)只是一个例子。实际上,在响应ajax调用时,我必须在代码中显示另一个div。假设我得到一条记录作为响应,我显示div,否则我显示“无记录存在”的自定义语句。但最终,Somemore代码应该在最后执行。有没有一种方法可以将自定义参数挂接到ajax调用上,正如您所说的name.query,它可以从其他代码中访问?当您调用dfr.resolve时,没有括号,它是一个回调-因此ajax调用返回的数据将对您的回调函数有效-因此在一个函数中的示例中,您可以通过调用gotResults来访问数据(数据)-数据现在可以在gotResults中作为var数据使用。如果调用someMoreCode(名称)-数据现在可以作为var名称使用到函数中-它是相同的数据。由于这是一个ajax响应,因此可以执行someMoreCode(数据、状态)-status,应该是一个表示success的字符串。现在,如果要向回调中添加特定的函数调用,可以将其作为包装调用的函数传递给函数…因此,不要使用。然后(someMoreCode('Ashish'))
因为我们知道这不起作用,可以这样包装:。然后(function(){someMoreCode('Ashish')})
。看到它在工作了吧。我已经包括了几个额外的函数,希望能展示如何在延迟对象和回调之间以不同的方式移动数据。
var dfr;
function search(query) {
$.ajax({
url: "http://search.twitter.com/search.json",
data: {
q: query
},
dataType: 'jsonp',
success: function(data){dfr.resolve(data);},
error: function(){dfr.reject();}
});
}
Test = {
start: function(){
dfr = $.Deferred();
alert("Starting");
return dfr.promise();
}
};
function gotresults(data) {
alert(data.max_id);
}
function showDiv() {
$('<div />').html("Results received").appendTo('body');
}
function showFailDiv() {
$('<div />').html("Results <b>NOT</b> received").appendTo('body');
}
Test.start()
.then(search('ashishnjain'))
.then(gotresults)
.then(showDiv)
.fail(showFailDiv);
function someMoreCode(name) {
alert('Hello ' + name.query);
}