0

我有以下代码:

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 元素的文本。它在控制台中打印以下内容:结果来自检查重复:真“。这让我相信我测试存储在 bduplicate 中的结果的方式是不正确的。

到目前为止我已经尝试过:

我在代码中包含以下行:

console.log(bduplicate);

看看我得到了什么。控制台打印对象的内容并包含一堆不同的属性。有一个叫做“responseText”的属性,上面写着 responseText: ""true"↵" 这可能是问题吗?虽然,如果是的话,它并没有解释为什么设置验证错误元素的测试通过了。

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

 return json.encode(true)

问题:

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

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

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

谢谢。

4

3 回答 3

1

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

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

于 2013-07-29T18:01:30.563 回答
1

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

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

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

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

于 2013-07-29T18:02:27.600 回答
1

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

于 2013-07-29T18:24:25.107 回答