javascript基础拾遗(十二)

本文介绍了JavaScript的单线程特性及其实现异步操作的方法,包括使用回调、Promise对象、改进后的Ajax请求,以及如何利用Promise进行串行和并行的任务执行。

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'
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值