zoukankan      html  css  js  c++  java
  • javascript基础拾遗(十二)

    1.javascript的单线程特性
    在javascript中,所有的代码都是单线程的
    因此所有的网络操作,浏览器事件,都必须是异步执行的,异步执行的逻辑是回调。

    function callback() {
            console.log('hello')
        }
        console.log('begin')
        setTimeout(callback, 1000)
        console.log('end')
    

    运行结果:
    begin end hello

    2.Promise对象
    像上列,和ajax等,承诺会在将来执行的对象,统称为Promise对象。
    Promise对象是ES6引入的,由浏览器来支持。

    function test(resolve, reject) {
            var timeOut = Math.random()*2
            console.log('timeOut '+timeOut)
            setTimeout(function () {
                if(timeOut<1){
                    console.log('call resolve1()')
                    resolve('200')
                }
                else{
                    console.log('call reject()')
                    reject('timeOut')
                }
            },timeOut*1000)
        }
        var p1 = new Promise(test)
        var p2 = p1.then(function (result) {
            console.log('成功'+result)
        })
        var p3 = p2.catch(function (result) {
            console.log('失败'+result)
        })
    

    test是异步执行函数,由两个参数resolve,reject,执行成功调用resolve,执行失败调用reject
    我们不关心resole,reject具体是怎么执行的。

    new Promise(test)用来执行异步函数,并在将来某一时刻获取执行成功,或失败的结果
    test函数执行成功,通过Promise对象
    p1.then(function (result) {
    console.log('成功'+result)
    })
    test函数执行失败,通知Promise对象
    p2.catch(function (reason) {
    console.log('失败:' + reason);
    });
    可以将上述代码串联起来:

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

    3.ajax改写

    function ajax(method, url, data) {
        var request = new XMLHttpRequest();
        return new Promise(function (resolve, reject) {
            request.onreadystatechange = function () {
                if (request.readyState === 4) {
                    if (request.status === 200) {
                        resolve(request.responseText);
                    } else {
                        reject(request.status);
                    }
                }
            };
            request.open(method, url);
            request.send(data);
        });
    }
    var log = document.getElementById('test-promise-ajax-result');
    var p = ajax('GET', '/api/categories');
    p.then(function (text) { // 如果AJAX成功,获得响应内容
        log.innerText = text;
    }).catch(function (status) { // 如果AJAX失败,获得响应代码
        log.innerText = 'ERROR: ' + status;
    });
    

    4.串行执行异步任务

    job1.then(job2).then(job3).catch(handleError);
    

    job1,job2,job3都是Promise对象

    5.并行执行异步任务
    多任务都执行完毕后,执行成功回调

    var p1 = new Promise(function (resolve, reject) {
        setTimeout(resolve, 500, 'P1');
    });
    var p2 = new Promise(function (resolve, reject) {
        setTimeout(resolve, 600, 'P2');
    });
    // 同时执行p1和p2,并在它们都完成后执行then:
    Promise.all([p1, p2]).then(function (results) {
        console.log(results); // 获得一个Array: ['P1', 'P2']
    });
    

    多任务只要有一个执行完毕,执行成功回调

    var p1 = new Promise(function (resolve, reject) {
        setTimeout(resolve, 500, 'P1');
    });
    var p2 = new Promise(function (resolve, reject) {
        setTimeout(resolve, 600, 'P2');
    });
    Promise.race([p1, p2]).then(function (result) {
        console.log(result); // 'P1'
    });
    
  • 相关阅读:
    MongoDB Projection
    MongoDB 删除文档
    MongoDB 更新文档
    MongoDB 删除文档
    MongoDB 查询文档
    MongoDB 插入文档
    MongoDB 数据类型
    MongoDB 删除集合
    MongoDB 创建集合
    MongoDB 删除数据库
  • 原文地址:https://www.cnblogs.com/shijingjing07/p/8016956.html
Copyright © 2011-2022 走看看