我正在做一个使用JQuery和Cakephp的应用程序。
在此我使用如下方法从控制器端检索值
var getformid;
$.getJSON("http://localhost/FormBuilder/index.php/forms/getFormEntry", function(json) {
getformid=json.forms[0]["id"];
alert("Form id inside "+getformid);
});//json
alert("Form id ouside "+getformid);
在上面的代码中,$ .getJSON内的内部警报为我提供了正确的值75 但外部警报显示错误为getformid未定义。为什么?我们不能使用$ .getJSON以外可用的getformid。请建议我。我想利用该值来保存字段..
编辑: 如果我尝试使用像
这样的代码var getformid;
$.getJSON("http://localhost/FormBuilder/index.php/forms/getFormEntry", myCallback);
function myCallback (json) {
getformid = json.forms[0]["id"];
// You can work with the response here
}
我收到的错误就像myCallback没有定义。我好吗? 我还应该在函数myCallback()
之外使用getformid值答案 0 :(得分:6)
在开始使用之前,您必须等到$.getJSON
返回值。所以如果你这样做:
var test;
$.getJSON('url', function(data) {
test = data;
});
alert(test); // you will get undefined here
这将提示undefined,因为JS不等待$.getJSON
完成获取数据(根据定义,AJAX是异步的),并且当测试尚未初始化时将调用alert。
您可能应该做的是将“外部”代码包装在某个函数中,并从$.getJSON
回调中调用该函数。
var test;
$.getJSON('url', function(data) {
test = data;
showAlert(); // this call will display actual value
});
function showAlert() {
alert(test);
}
答案 1 :(得分:2)
正如其他人所说,$.getJSON
来电是异步的,并且没有及时完成外部警报。
如果您希望警报功能可以同步,
var getformid;
$.ajax({
async: false, // This will make call synchronous
url: "http://localhost/FormBuilder/index.php/forms/getFormEntry",
dataType: "json",
success: function(json) {
getformid=json.forms[0]["id"];
alert("Form id inside "+getformid);
}
});//json
alert("Form id ouside "+getformid);
但通常这是一个坏主意。我可能会在登录脚本中执行此操作,在此我不希望用户继续,直到我从服务器获得响应,但通常我会在回调函数中异步执行所有实际工作。
答案 2 :(得分:0)
getJSON回调是在请求结束时异步执行的,你应该使用回调中的值,如果你不喜欢在回调函数里面 getJSON调用,你可以声明一个在那里运作并处理你的逻辑:
$.getJSON("http://localhost/FormBuilder/index.php/forms/getFormEntry", myCallback);
function myCallback (json) {
var formId = json.forms[0]["id"];
// You can work with the response here
}