我有一个[可能是愚蠢的]问题,但我搜索并搜索过,但仍未找到答案。
我创建了一个函数,它将我的httprequest调用存储到我的服务器,然后将POST方法的webservice URL和参数传递给函数。我的事件处理函数调用web球必须对响应做一些事情。
不幸的是,在我拥有需要的值之前,调用Web调用函数之后的代码正在执行,这会导致巨大的错误。我的代码如下所示:
function process_stuff() {
do_stuff;
var d = webcall(link, params);
if (d == "OK") {
do_stuff2;
}
}
function webcall(link, params) {
//httprequest...;
return responseText;
}
检查d失败,因为它在填充d之前执行if语句,因此d保持未定义或null ..请帮助。如何让代码等到d使用来自webcall的值填充?
编辑:
根据您的评论,这里是代码:
function checker () {
var d; // declare d here so it is global among process_logic() and give_alert()
function process_logic(callback) {
var params = "func=" + encodeURIComponent("webcalls");
params += "&text=" + encodeURIComponent("yadda");
var linker = "http://www.wigital.co.za/test/test.php";
d = webcall(params, linker, callback);
alert(d + ' on line 63');
}
function give_alert(d) {
if (d == "OK") {
alert("Success");
} else {
alert("not so sure... " + d);
}
}
//process_logic(give_alert(d));
process_logic(give_alert());
}
function webcall(a, link) {
// a = paramaters string, link is the URL of the web service
//alert(callback);
var d;
var x = new XMLHttpRequest();
/* What to do when server responds - define this before sending to server */
x.onreadystatechange = function () {
/* Error check */
if (x.readyState === 4 && x.status !== 200) {
return("PROBLEM: " + x.response);
}
/* Process response */
if (x.readyState === 4 && x.status === 200) {
//alert("I have a return value");
return x.responseText;
//alert(x.responseText);
//d = x.responseText;
}
};
/* send to server */
x.open("POST", link, true);
x.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
x.send(a);
/*
if (typeof callback === 'function') {
callback(d);
}*/
}
我想要填充函数give_alert()中的变量d。目前尚未定义,因为在完成webcall()并返回值之前,give_alert()正在执行...
答案 0 :(得分:0)
我强烈建议将回调函数传递给网络请求。
std::sort
答案 1 :(得分:0)
Mozilla的文档是clear。虽然您可以执行请求,例如:
var request = new XMLHttpRequest();
request.open('GET', '/bar/foo.txt', false); // `false` makes the request synchronous
request.send(null);
if (request.status === 200) {
console.log(request.responseText);
}
使用request.open(..., false)
发出同步请求。正如注释所建议的那样,使用方法promise(不要阻止脚本执行)。