首頁 >web前端 >js教程 >如何實現AJAX 的非同步功能

如何實現AJAX 的非同步功能

零到壹度
零到壹度原創
2018-04-08 17:19:562210瀏覽


本文給大家分享的是如何實作AJAX的非同步功能,非常的詳細,也很實用,適合JavaScript的初學者,有需要的朋友參考下。

關於AJAX非同步功能的小實驗

為了實驗ajax的非同步

性,先建一個Web項目,結構大概是這個樣子

如何實現AJAX 的非同步功能

TestServlet.java(主要是提供ajax後台呼叫的程式)

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class TestServelet
 */
 @WebServlet("/TestServelet")
 public class TestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
     /**
     * Default constructor. 
     */
    public TestServlet() {
    }    
    
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        
    //为了体现程序的异步性,先让它睡3s
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        response.setCharacterEncoding("utf-8");  
        //打印出程序运行的时间
        System.out.println("异步程序运行时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS") .format(new Date()));
    }    
    
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

testAjax.jsp(前台頁面和js,觸發非同步呼叫)

<%@ page language="java" contentType="text/html;charset=UTF-8" %>
<html >
<head></head>
<body onload="testajax()">
    Hello Ajax!<br>
</body>
</html>
<SCRIPT LANGUAGE="JavaScript">
    function testajax(){
        fnGetAjaxReturn(&#39;http://localhost:8080/TestProject/TestServlet?a=&#39;+Math.random());
    }    
    
    function fnGetAjaxReturn(url)
    {   
        var userAgent = navigator.userAgent;        
        var http_request = false;        
        //开始初始化XMLHttpRequest对象
        if(window.XMLHttpRequest) { //Mozilla 浏览器
            http_request = new XMLHttpRequest();            
            if (http_request.overrideMimeType) {//设置MiME类别
                http_request.overrideMimeType("text/xml");
            }
        }        
        //else if (window.ActiveXObject) { // IE浏览器
        else if (window.ActiveXObject||userAgent.indexOf("Trident") > -1){          
           try {
                http_request = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {                try {
                    http_request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {alert("错了吧");}
            }
        }        if (!http_request) { // 异常,创建对象实例失败
            window.alert("不能创建XMLHttpRequest对象实例.");            
            return false;
        }
        http_request.open("GET", url, true);//true 异步  false 同步 
        http_request.send();
        alert("异步请求之后执行时间:"+new Date +&#39;\n毫秒数:&#39;+ new Date().getMilliseconds());
    }</script>

說明:jsp頁面載入之後呼叫一個js,js中會先發出一個非同步請求,再執行一個alert彈出操作。


下面開始試驗

使用IE瀏覽器,執行URL
http://localhost:8080/TestProject/testAjax.jsp

發現,程式先彈出了alert,過了3s鐘,ajax才回傳了後台結果,充分證明了ajax的非同步性。

運行結果:

如何實現AJAX 的非同步功能

從時間的差異性,發現程式先執行結束(執行了alert),過了3s鐘,非同步程式才回傳結果。


反過來,如果把jsp檔案中的

http_request.open("GET", url, true);

#true 改為 false呢?

執行URL,發現程式在苦苦等待Servlet後台請求回傳之後,才執行了js中的最後一段程式碼alert,正是所謂的同步呼叫。

運行結果如下:

如何實現AJAX 的非同步功能

The end!

以上是如何實現AJAX 的非同步功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn