2017-07-08 150 views
-1

问题:如果我调用ajax函数,我无法获得返回值。Javascript ajax返回错误值

下面是我的简单的JavaScript和ajax文件。

的Javascript阿贾克斯

<script type="text/javascript"> 
    function loadDoc() { 
     var xhttp = new XMLHttpRequest(); 
     xhttp.onreadystatechange = function() { 
      if (this.readyState == 4 && this.status == 200) { 
       return this.responseText; 
      } 
     }; 
     xhttp.open("GET", "testAjax.php", true); 
     xhttp.send(); 
    } 
    alert(loadDoc()); 
</script> 

PHP

<?php 
    echo "Hello World !!!"; 
?> 

synchronousasynchronous概念可以对这个问题有用吗?

谢谢。

+0

检查您的浏览器控制台'JS'错误 – urfusion

+0

我没有得到任何错误得到'在警报undefined'。 –

+0

根据[PSR-2 2.2](http://www.php-fig.org/psr/psr-2/#files),如果该文件只包含PHP,请考虑删除结尾'?>'。 – bnahin

回答

2

问题是ajax请求的异步性质和代码的执行流程。在达到onreadystatechange条件时调用的回调不能保证在主函数结束前完成。为了实现从您需要使用Promises

let oPromise = new Promise((resolve, reject) => { 
    var xhttp = new XMLHttpRequest(); 
    xhttp.onreadystatechange = function() { 
     if (this.readyState == 4 && this.status == 200) { 
      resolve(this.response); 
     } 
    }; 
    xhttp.open('GET', 'testAjax.php', true); 
    xhttp.send(); 
}); 

oPromise.then((data) => { 
    alert('Whoohoo! -> ' + data); 
}); 

到的一些语法上面会感到陌生的AJAX功能的回报,也许有点困惑 - 它可以在这样一个更familar /臣民的方式改写:

let oPromise = new Promise(function(resolve,reject){ 
    var xhr = new XMLHttpRequest(); 
    xhr.onload=function(){ 
     resolve(this.response) 
    }; 
    xhr.onerror=function(){ 
     reject(this.readyState) 
    }; 
    xhr.open('GET', 'testAjax.php', true); 
    xhr.send(); 
}); 
oPromise.then(function(response){ 
    alert('Whoohoo! -> ' + response); 
}); 
+0

谢谢,它会正常工作。 –

1

你需要改变你的逻辑是这样的:

function doJobWhenAjaxResultIsReturned(ajaxData){ 
    // alrt(ajaxData); 
} 
function loadDoc() { 
    var xhttp = new XMLHttpRequest(); 
    xhttp.onreadystatechange = function() { 
    if (this.readyState == 4 && this.status == 200) { 
     doJobWhenAjaxResultIsReturned(this.responseText); 
    } 
    }; 
    xhttp.open("GET", "testAjax.php", true); 
    xhttp.send(); 
} 
loadDoc(); 

然后你在doJobWhenAjaxResultIsReturned()想要什么。