2016-12-10 22 views
0

我有這樣的代碼:變量 「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沒有存儲數據。它等於「未定義」。我需要存儲PHP值返回。我一直在努力工作,但沒有找到解決方案。

我能做些什麼來解決這個問題?任何想法 ?

謝謝。

+0

顯示一些PHP代碼 – wscourge

+0

嗨@wscourge。 這是(不是全部)PHP腳本的一部分。我測試了它,並且Works很棒。 要求....... $ objectProduct = new product_Model(); $ option = $ objectProduct-> existProduct($ codProduct); //返回1或0 echo $ option; – Gregory

+0

//在Javascript方面 ajax.onreadystatechange = function() if(ajax.readyState == 4 && ajax.status == 200){0}回調(ajax.responseText); } }; 我測試了它,工作正常。要觀看PHP結果,我使用了Firefox的控制檯。它返回了正確的值。問題出在Javascript方面。 – Gregory

回答

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

您的代碼中的另一個錯誤與您的代碼無關,因爲您沒有將「params」字符串添加到您的ajax請求中,您可能需要確保在發送請求之前將參數正確添加到請求中。 – djdduty

0

這是parcial解決方案,工作正常。但它使用「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」。可能是工程