Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery延迟不工作_Javascript_Jquery_Ajax_Jquery Deferred - Fatal编程技术网

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