javascript — переменная «encontrado» имеет неопределенное значение после функции обратного вызова

У меня есть этот код:

JavaScript:

function foo(callback){
var producto = $("#inpt-producto").val();

var ajax = new XMLHttpRequest();
var url = "file_products.php"; // It will return 1 or 0
var params = "producto=" + producto;
ajax.open("POST", url, true);ajax.onreadystatechange = function()
{
if(ajax.readyState == 4 && ajax.status == 200) {

callback(ajax.responseText);

}
};

ajax.send(params);
}

PHP:

$objectProduct = new product_Model();
$option = $objectProduct->existProduct($codProduct); // return 1 or 0
echo $option

Он отлично работает для меня. Но следующий код не сработал.

var encontrado = foo(function(result){ // I need store it in "encontrado" variable.
console.log(result);//Actually return 1 or 0 value
});
console.log(encontrado); //Return Undefined :-(

Файл file_products.php вернуть 1 или 0.

Переменная encontrado не хранить данные. РавноНеопределенныйMsgstr «Мне нужно хранить возвращаемое значение PHP. Я усердно работал, но не нашел решения.

Что я могу сделать, чтобы это исправить? Любая идея ?

Благодарю.

0

Решение

В этом случае переменная encontrado устанавливается на возвращение foo функция, но foo функция вообще ничего не возвращает, поэтому undefined, Я собираюсь предположить, что вы хотите encontrado быть установлен на результат вызова ajax, поэтому следующий код — это то, что вы будете делать.

var encontrado;
foo(function(result){
encontrado = result;
console.log(encontrado);
});

Теперь имейте в виду, что encontrado все еще будет undefined если обратный вызов не произошел, поэтому не пытайтесь использовать его, пока обратный вызов не будет выполнен.

Кроме того, вы, вероятно, ожидали encontrado быть результатом обратного вызова, но это не так, как работает JavaScript. Вместо этого было бы установлено возвращаемое значение функции foo. И чтобы устранить любую возможную путаницу, console.log не возвращает никакого значения, он просто выводит его на консоль, чтобы вернуть значение на самом деле return some_variable;,

0

Другие решения

Это частные решения, работает нормально. Но он использует «async: false».

if(producto!=""){
encontrado = foo();
}

if(nombre==""){
$("#messagesDiv").html("Field is empty");
isValid = false;
}else
if(encontrado==1){
$("#messagesDiv").html("Field is empty.");
$("#inpt-producto").focus();
isValid = false;
}

......
more validations....
......
......

if(isValid){
//Request and save data in Data base
}function foo()
{

var producto = $("#inpt-producto").val();
var parameters = "producto=" + producto ;

url = 'producto.php',

ajax = new XMLHttpRequest(),
u = null;

ajax.open('POST', url, false);
ajax.onreadystatechange = function()
{
if (ajax.readyState == 4)
{
if (ajax.status == 200){
u = ajax.responseText;
}
}
};

ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
ajax.setRequestHeader("Connection", "close");
ajax.send(parameters);

return u;
}

Пока все в порядке. Но я думаю изменить и улучшить это. Я нашел «Отложенный объект» из jQuery. Может быть Работы

0