我正在努力解决我的精神障碍:吵闹。我读过How to return value from an asynchronous callback function?和How to return the response from an Ajax call?(以及其他许多帖子中),事实上后者对另一个问题很有帮助。然而,我现在要做的只是略有不同,我正在试图让它适应我的代码。也许我的方法是完全错误的/根本上有缺陷的(并且不仅仅是不成熟的,我可以忍受)?
我的问题的本质是,不是简单地将ajax结果返回给回调函数,而是需要生成的json可用于不同的函数,对应于不同的事件,即:
linkOne.onclick =调用ajaxReq + getJsonData,然后以getJsonData结果作为参数调用functionOne linkTwo.onclick =调用ajaxReq + getJsonData,然后以getJsonData结果作为参数调用functionTwo linkThree.onclick =调用ajaxReq + getJsonData,然后以getJsonData结果作为参数调用functionThree
使用link.onclick定义不能这样做吗?为什么这不起作用:
linkThree.onclick = functionOne(getJsonData);
这是我的代码:
function ajaxReq() {
var request = new XMLHttpRequest();
return request;
}
function getJsonData() {
var request = ajaxReq();
request.open("GET", "/myJSON.json", true);
request.setRequestHeader("content-type", "application/json");
request.send(null);
request.onreadystatechange = function() {
if (request.readyState === 4) {
if (request.status === 200) {
var myJsonString = JSON.parse(request.responseText);
var myJsonArray = myJsonString["An Array in myJSON.json"];
// functionOne(myJsonArray); // callback: what if I need to pass this value to various functions?
return myJsonArray; // ... 'cause this ain't doin' it, and I don't know why
}
}
} // onreadystatechange
} // getJsonData
function functionOne(myJsonArray) {
var myJsonArray = getJsonData(); // why doesn't this work, since, in getJsonData, var request = ajaxReq(); returns an ajax request ?
}
为什么,如果var request = ajaxReq();调用ajaxReq函数并将其结果返回给getJsonData,var myJsonArray = getJsonData();在functionOne中没有做同样的事情?
非常感谢任何帮助。 (p.s.寻求一个纯粹的javascript修复,而不是jQuery。)
SVS
答案 0 :(得分:1)
正如您在指定的链接中回答的那样,我们无法从异步调用返回值以在同步函数调用中使用它。所以这就是诀窍 -
为所有onclick侦听器分配一个常用功能。
link1.onclick = someCommonfunction;
link2.onclick = someCommonfunction;
link3.onclick = someCommonfunction;
并定义如下的常用函数,它将在回调中包含json数据,并且您可以将该数据传递给任何函数调用。
function someCommonfunction(e) {
/* this is the function which will be finally executed with json data after clicking */
var callback = function(jsonData) {
var myJsonArray = jsonData;
//do some condition check and call functionOne, functionTwo or functionThree
};
getJsonData(callback);
}
我修改了getJsonData
以使用响应数据调用callback
。
function getJsonData(callback) {
var request = ajaxReq();
request.open("GET", "/myJSON.json", true);
request.setRequestHeader("content-type", "application/json");
request.send(null);
request.onreadystatechange = function() {
if (request.readyState === 4) {
if (request.status === 200) {
var myJsonString = JSON.parse(request.responseText);
var myJsonArray = myJsonString["An Array in myJSON.json"];
callback(myJsonArray);
}
}
} // onreadystatechange
} // getJsonData