理解异步调用返回的对象

时间:2013-07-29 17:50:20

标签: jquery ajax getjson

我有以下代码:

var bduplicate;
bduplicate = false;
bduplicate = check_for_duplicate_rule().done(function (result) {
    console.log("result from check for duplicate" + result);
    if(result == 'true') {
        $('#validation_error').html("A similar rule already exists");
        return result;
    }
});

console.log(bduplicate);

if(bduplicate.success == 'true') {
    console.log('im exiting');
    return false; //exit this function
}

以下是异步方法本身的定义:

function check_for_duplicate_rule() {
    var parameters = {
        num: $('#num').val(),
        condition: $('#condition').val(),
        cdidnumber: $('#cdidnumber').val()
    }

    return $.getJSON(
        url = aURLdefinedsomewhere,
        parameters,
        function (data) {
            //if (data=='true') {                               
            //$('#validation_error').html("A similar rule already exists");     
            //}
        } //end data
    ); //end getJSON        
}

问题:

系统永远不会进入打印到控制台“即时进入”的IF语句。但它确实正确地更改了validation_error元素的文本。它在控制台中打印以下内容:检查重复的结果:true“。这使我相信我正在测试存储在bduplicate中的结果的方式是不正确的。

到目前为止我尝试了什么:

我在代码中包含以下行:

  

的console.log(bduplicate);

看看我要回来了。控制台打印对象的内容并包含许多不同的属性。有一个名为“responseText”的属性,它表示responseText:“”true“↵” 这可能是问题吗?虽然如果是,但它没有解释为什么设置验证错误元素的测试通过。

如果有帮助,服务器就是ajax调用的数据,如下所示:

 return json.encode(true)

问题:

  1. 除了试图弄清楚为什么我无法让代码显示“console.log('im exiting')”命令的结果,我也想知道我的方式m返回json数据是否正确?
    我从某处读到技术上看起来应该是这样的:

    返回json.encode('success:true') 如果这是正确的,我将如何在前端测试true?

  2. 有人能指出一些关于.done()方法返回的对象的文档吗?我一直在搜索jquery API,但还没有找到任何东西。我可能没有用正确的关键词搜索。

  3. 感谢。

3 个答案:

答案 0 :(得分:1)

对问题1的回答:该调用是异步的,这意味着您可以在请求完成之前有其他进程。 console.log(bduplicate);有点误导,因为在Chrome中它会向您显示更新的对象,但实际上在通话完成之前不会更新。回调之外的任何代码都将被执行 BEFORE 。您需要弄清楚如何在回调处理程序中正确传递数据。

对问题2的回答: jQuery.ajax > jqXHR.done promises / deferred 范例(http://api.jquery.com/deferred.done/)的一部分。该对象来自jqXHR http://api.jquery.com/jQuery.ajax/#jqXHR的私有实例。

答案 1 :(得分:1)

jQuery AJAX方法,如$.getJSON,返回一个延迟对象。这些允许您附加在AJAX调用完成时触发的回调。

.done()正在附加回调。使用AJAX,它是异步的。这意味着它发生在后台。您无法从异步方法返回。你的return result;绝对没有。

您需要执行所有操作,这些操作与回调中的返回数据有关。

以下是jQuery的延迟对象的文档:http://api.jquery.com/category/deferred-object/

答案 2 :(得分:1)

要回答您的第一个问题,请安装Chromium,点击您的页面,然后按Ctrl-Shift-i打开调试器。然后点击sources选项卡,找到你的js文件并设置一个断点。当你的断点被击中时,检查你的对象。 Chromium很乐意扩展您的物品。