如何与httprequest同步执行Javascript

时间:2017-02-15 14:09:30

标签: javascript asynchronous execution

我有一个[可能是愚蠢的]问题,但我搜索并搜索过,但仍未找到答案。

我创建了一个函数,它将我的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()正在执行...

2 个答案:

答案 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(不要阻止脚本执行)。