博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript基础拾遗(十二)
阅读量:6307 次
发布时间:2019-06-22

本文共 2787 字,大约阅读时间需要 9 分钟。

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'});

转载地址:http://nwixa.baihongyu.com/

你可能感兴趣的文章
大规模学习该如何权衡得失?解读NeurIPS 2018时间检验奖获奖论文
查看>>
大厂前端高频面试问题与答案精选
查看>>
我们用5分钟写了一个跨多端项目
查看>>
Visual Studio 15.4发布,新增多平台支持
查看>>
有赞透明多级缓存解决方案(TMC)设计思路
查看>>
如何设计高扩展的在线网页制作平台
查看>>
Git 2.5增加了工作树、改进了三角工作流、性能等诸多方面
查看>>
Swift 5将强制执行内存独占访问
查看>>
中台之上(二):为什么业务架构存在20多年,技术人员还觉得它有点虚?
查看>>
深度揭秘腾讯云低功耗广域物联网LPWAN 技术及应用
查看>>
与Jeff Sutherland谈敏捷领导力
查看>>
More than React(四)HTML也可以静态编译?
查看>>
React Native最佳学习模版- F8 App开源了
查看>>
云服务正在吞噬世界!
查看>>
阅读Android源码的一些姿势
查看>>
Web语义化标准解读
查看>>
一份代码构建移动、桌面、Web全平台应用
查看>>
高性能 Lua 技巧(译)
查看>>
区分指针、变量名、指针所指向的内存
查看>>
异步编程的世界
查看>>