2017-02-15 3 views
1

У меня есть [вероятно, глупый вопрос], но я искал и искал и до сих пор не нашел ответа.Как выполнить Javascript синхронно с httprequest

Я создал функцию, в которой хранятся мои вызовы httprequest на моем сервере, и я передаю URL-адрес webservice и параметры метода POST в функцию. Моя функция обработки событий, которая вызывает этот веб-шар, должна что-то сделать с ответом.

К сожалению, код после вызова функции веб-вызова выполняется до того, как у меня есть требуемое значение, которое вызывает огромные ошибки. Мой код выглядит следующим образом:

function process_stuff() { 
    do_stuff; 
    var d = webcall(link, params); 
    if (d == "OK") { 
     do_stuff2; 
    } 
} 

function webcall(link, params) { 
    //httprequest...; 
    return responseText; 

} 

Проверка на г не удается, как он выполняется, если заявление, прежде чем d заполняется, поэтому d остается неопределенным или пустой .. Пожалуйста, помогите. Как заставить код ждать, пока d не будет заполнено значением из веб-камеры?

EDIT:

Вот код в соответствии с вашими комментариями:

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() заселяться. В настоящее время это неопределено, поскольку функция give_alert() выполняется до того, как webcall() завершил и вернул значение ...

+2

Возможно, вам понадобится показать нам ваш полный код, а не '// httprequest ...;', если вы хотите, чтобы мы могли найти проблему. –

+0

Это обычная проблема с кучей шаблонов для ее решения. Без дополнительного кода будет сложно найти решение вашей конкретной проблемы, но попробуйте исследовать JavaScript 'Promises' как одно из возможных решений. – GSP

+2

Слово процессуальное неверно в этом контексте, вы ищете синхронное выполнение. , чтобы убедиться, что вы столкнулись с ошибкой или неправильной реализацией, вам нужно будет показать код, который вы используете для выполнения HTTP-запроса. Как правило, вам придется использовать обратный вызов или оптимальное обещание. Ссылка на обещания: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise – omerkarj

ответ

0

Я очень рекомендую передать функцию обратного вызова в веб-запрос.

function process_stuff() { 
    do_stuff; 
    webcall(link, params, callback); 
} 

function callback(data){ 
    do_stuff2; 
} 

function webcall(link, params, callback) { 
    //httprequest...; 

    //on success 
    callback(response) 

} 
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) сделать запрос синхронизации. Как следует из комментариев, используйте метод обещать (не блокируйте выполнение скрипта).

Смежные вопросы