【问题标题】:Variable "encontrado" has 'undefined' value after Callback function回调函数后变量“encontrado”具有“未定义”值
【发布时间】:2016-12-11 13:48:35
【问题描述】:

我有这个代码:

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 值返回。我一直在努力,但没有找到解决方案。

我能做些什么来解决它?有什么想法吗?

谢谢。

【问题讨论】:

  • 显示一些php代码
  • 嗨@wscourge。这是(不是全部)PHP 脚本的一部分。我对其进行了测试,效果很棒。需要....... $objectProduct = new product_Model(); $option = $objectProduct->existProduct($codProduct); // 返回 1 或 0 echo $option;
  • //在Javascript端 ajax.onreadystatechange = function() { if(ajax.readyState == 4 && ajax.status == 200) { callback(ajax.responseText); } };我对其进行了测试并且工作正常。为了查看 PHP 结果,我使用了 Firefox 控制台。它返回了正确的值。问题出在 Javascript 方面。

标签: javascript php callback undefined asynccallback


【解决方案1】:

在这种情况下,变量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;

【讨论】:

  • 代码中的另一个不相关的错误是您没有将 params 字符串添加到您的 ajax 请求中,您可能需要确保在之前将参数正确添加到请求中发送请求。
【解决方案2】:

这是部分解决方案,工作正常。但它使用“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 的“延迟对象”。可能是作品

【讨论】:

    猜你喜欢
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 2020-04-14
    • 2020-03-18
    • 1970-01-01
    相关资源
    最近更新 更多