我有以下代码:
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)
问题:
除了试图弄清楚为什么我无法让代码显示“console.log('im exiting')”命令的结果,我也想知道我的方式m返回json数据是否正确?
我从某处读到技术上看起来应该是这样的:
返回json.encode('success:true') 如果这是正确的,我将如何在前端测试true?
有人能指出一些关于.done()方法返回的对象的文档吗?我一直在搜索jquery API,但还没有找到任何东西。我可能没有用正确的关键词搜索。
感谢。
答案 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很乐意扩展您的物品。