2017-07-08 197 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()想要什麼。