zoukankan      html  css  js  c++  java
  • AJAX

    如果要让用户留在当前页面中,同时发出新的HTTP请求,就必须用JavaScript发送这个新请求,接收到数据后,再用JavaScript更新页面,这样一来,用户就感觉自己仍然停留在当前页面,但是数据却可以不断地更新。

    AJAX请求是异步执行的,也就是说,要通过回调函数获得响应

    在现代浏览器上写AJAX主要依靠XMLHttpRequest对象:

    对于低版本的IE,需要换一个ActiveXObject对象。
    如果你想把标准写法和IE写法混在一起,可以这么写:
    var request; if (window.XMLHttpRequest) { request = new XMLHttpRequest(); } else { request = new ActiveXObject('Microsoft.XMLHTTP'); }
    通过检测window对象是否有XMLHttpRequest属性来确定浏览器是否支持标准的XMLHttpRequest

    创建了XMLHttpRequest对象后,要先设置onreadystatechange的回调函数

    在回调函数中,通常我们只需通过readyState === 4判断请求是否完成,如果已完成,再根据status === 200判断是否是一个成功的响应。

    XMLHttpRequest对象的open()方法有3个参数,第一个参数指定是GET还是POST,第二个参数指定URL地址,第三个参数指定是否使用异步,默认是true,所以不用写。

    注意,千万不要把第三个参数指定为false,否则浏览器将停止响应,直到AJAX请求完成。如果这个请求耗时10秒,那么10秒内你会发现浏览器处于“假死”状态。

    最后调用send()方法才真正发送请求GET请求不需要参数,POST请求需要把body部分以字符串或者FormData对象传进去。

    Promise

    在JavaScript的世界中,所有代码都是单线程执行的。

    由于这个“缺陷”,导致JavaScript的所有网络操作,浏览器事件,都必须是异步执行。异步执行可以用回调函数实现:

    function callback() {
        console.log('Done');
    }
    console.log('before setTimeout()');
    setTimeout(callback, 1000); // 1秒钟后调用callback函数
    console.log('after setTimeout()');
    

    观察上述代码执行,在Chrome的控制台输出可以看到:

    before setTimeout()
    after setTimeout()
    (等待1秒后)
    Done
    

    可见,异步操作会在将来的某个时间点触发一个函数调用。

    这种“承诺将来会执行”的对象在JavaScript中称为Promise对象。

    我们先看一个最简单的Promise例子:生成一个0-2之间的随机数,如果小于1,则等待一段时间后返回成功,否则返回失败:

    function test(resolve, reject) {
        var timeOut = Math.random() * 2;
        log('set timeout to: ' + timeOut + ' seconds.');
        setTimeout(function () {
            if (timeOut < 1) {
                log('call resolve()...');
                resolve('200 OK');
            }
            else {
                log('call reject()...');
                reject('timeout in ' + timeOut + ' seconds.');
            }
        }, timeOut * 1000);
    }
    

    这个test()函数有两个参数,这两个参数都是函数,如果执行成功,我们将调用resolve('200 OK'),如果执行失败,我们将调用reject('timeout in ' + timeOut + ' seconds.')。可以看出,test()函数只关心自身的逻辑,并不关心具体的resolvereject将如何处理结果。

    有了执行函数,我们就可以用一个Promise对象来执行它,并在将来某个时刻获得成功或失败的结果:

    var p1 = new Promise(test);
    var p2 = p1.then(function (result) {
        console.log('成功:' + result);
    });
    var p3 = p2.catch(function (reason) {
        console.log('失败:' + reason);
    });
    

    变量p1是一个Promise对象,它负责执行test函数。

    Promise对象可以串联起来,所以上述代码可以简化为:

    new Promise(test).then(function (result) {
        console.log('成功:' + result);
    }).catch(function (reason) {
        console.log('失败:' + reason);
    });

     

  • 相关阅读:
    GO开发[一]:golang语言初探
    Python带参数的装饰器
    Python函数篇
    19. logging模块
    18. json模块
    17. os模块
    16. sys模块
    15. random模块
    14. 模块-time模块
    29. java面向对象项目
  • 原文地址:https://www.cnblogs.com/EganZhang/p/6548331.html
Copyright © 2011-2022 走看看