变量" encontrado"有未定义的'回调函数

时间:2016-12-10 02:41:08

标签: javascript php callback undefined asynccallback

我有这段代码:

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没有存储数据。它等于" 未定义"。我需要存储PHP值返回。我一直在努力,但没有找到解决方案。

我该怎么做才能修复它?有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:0)

在这种情况下,变量encontrado被设置为foo函数的返回,但foo函数根本不返回任何内容,因此它是{{1 }}。我假设您希望将undefined设置为ajax调用的结果,因此以下代码就是您要做的。

encontrado

现在,请记住encontrado仍然是var encontrado; foo(function(result){ encontrado = result; console.log(encontrado); }); ,除非回调已经发生,所以在回调执行之前不要尝试使用它。

此外,您可能希望undefined成为回调的结果,但这不是javascript的工作原理。它将被设置为foo函数的返回值。为了消除任何可能的混淆,encontrado不会返回任何值,只是将其输出到控制台,以返回实际值为console.log的值。

答案 1 :(得分: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的“Deferred Object”。可能是作品