js中promise学习

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>promise学习</title>

<!-- 在js中,所有代码都是单线程执行的 -->

<!-- 异步执行:可以使用回调,在ES6中我们可以使用Promise对象来实现 -->

<!--

1.1Promise对象,只需要then一个方法,then方法带有如下三个参数

    1.成功回调

    2.失败回调

    3.前进回调(暂时不讲)

    一个全新的 promise 对象从每个 then 的调用中返回。

1.2 Promise对象代表一个异步操作,其不受外界影响,有三种状态

.Pending进行中

.Resolved(已完成,又称Fulfilled)

.Rejected(已失败)

1.3使用Promise的优势

1.3.1 解决回调地狱问题(Callback Hell)

例如,有时候我们可能会进行多个异步操作,后一个的请求需要上一次请求的返回结果,所以过去我们都是用callback层层嵌套,

但是多了的话就会出现回调地狱,代码的可读性和维护性都会变得很差

firstAsync(function(data){

                        //处理得到的 data 数据

//....

secondAsync(function(data2){

//处理得到的 data2 数据

//....

thirdAsync(function(data3){

  //处理得到的 data3 数据

  //....

});

});

});

1.3.2 使用promise的话,代码会变得扁平和可读.前面提到了then返回一个promise,因此我们可以将then的调用不停的串联起来,其中then返回的

promise装载了由调用返回的值.

firstAsync()

.then(function(data){

//处理得到的 data 数据

//....

return secondAsync();

})

.then(function(data2){

//处理得到的 data2 数据

//....

return thirdAsync();

})

.then(function(data3){

//处理得到的 data3 数据

//....

});

1.3.3 更好的进行错误捕获

多层嵌套会造成无法捕获异常,使用promise,通过使用reject方法把promise的状态设置为rejected,这样我们在then中就能捕捉到,然后执行失败情况的回调

function fetch(callback) {

return new Promise((resolve, reject) => {

setTimeout(() => {

reject('请求失败');

}, 2000)

})

}

fetch()

.then(

function(data){

console.log('请求处理');

console.log(data);

},

function(reason, data){

console.log('触发异常');

console.log(reason);

}

);

当然我们在catch方法中处理reject回调也是可以的,

function fetch(callback) {

return new Promise((resolve, reject) => {

setTimeout(() => {

reject('请求失败');

}, 2000)

})

}

fetch()

.then(

function(data){

console.log('请求处理');

console.log(data);

}

)

.catch(function(reason){

console.log('触发异常');

console.log(reason);

});

-->

</head>

<body>

<script type="text/javascript">

new Promise(function(resolve, reject) {

console.log('start new Promise...');

var timeOut = Math.random() * 2;

console.log('set timeout to: ' + timeOut + ' seconds.');

setTimeout(function() {

if (timeOut < 10) {

console.log('call resolve()...');

resolve('200 OK');

} else {

console.log('call reject()...');

reject('timeout in ' + timeOut + ' seconds.');

}

}, timeOut * 1000);

}).then(function(r) {

console.log('Done: ' + r);

}).catch(function(reason) {

console.log('Failed: ' + reason);

});

// promise的使用详解,简单来讲,then方法就是把原来的回调写法分离出来,在异步执行操作执行完成后,用链式调用的方式,回调函数;

// 我们可以在then方法中继续写promise对象并返回,然后继续调用then进行回调操作

// then方法举例          例如 学习 考试  放假

function study() {

var p = new Promise(function(resolve, reject) {

setTimeout(() => {

resolve("学习结束,开始考试")

}, 2000)

});

return p;

}

function test(data) {

var p = new Promise(function(resolve, reject) {

setTimeout(() => {

resolve("考试结束,开始假期")

}, 2000)

});

return p;

}

function holiday(data) {

var p = new Promise(function(resolve, reject) {

setTimeout(() => {

resolve("假期结束,开始上课")

}, 2000)

});

return p;

}

// 使用then链式调用这三个方法

study()

.then(function(data) {

console.log(data)

return test(data);

})

.then(function(data) {

console.log(data)

return holiday(data)

})

.then(function(data) {

console.log(data)

})

// 运行结果

// 学习结束,开始考试

// 试结束,开始假期

// 假期结束,开始上课

// 2.reject方法

function learn() {

var p = new Promise(function(reslove, reject) {

setTimeout(() => {

reject("考试不及格")

}, 1000)

});

return p;

}

learn()

.then(test, function(data) {

console.log(data + "无法放假,复习吧");

})

// 执行结果

// 考试不及格无法放假,复习吧

// 另外如果我们只要处理失败的情况,可以使用then(null,.....),或者使用catch方法

learn()

.then(null, function(data) {

console.log(data + "无法放假,复习吧");

})

// catch方法和then方法的第二个参数一样,用来指定reject的回调

learn()

.then(test)

.catch(function(data) {

console.log("没得玩了");

})

// 另一个作用是,当执行resolve的回调时,如果抛出了异常(代码出错),那么也不会报错卡死js,而是会进到这个catch中

study()

.then(function(data) {

throw new Error("考题泄漏");

test(data)

})

.catch(function(data) {

console.log(data + "无法继续考试")

})

// all方法,提供了并行异步执行操作的能力,并且在所有异步操作执行完后才会执行回调

// 例如放假要等到学习和考试之后

setTimeout(() => {

Promise.all([study(), test(),holiday()])

.then(function(data) {

console.log("开始放假了:后面的是data数据  "+data.length+"第一个:"+data[0]+"第二个:"+data[1]+"第三个:"+data[2])

// 打印结果:  开始放假了:后面的是data数据  3第一个:学习结束,开始考试第二个:考试结束,开始假期第三个:假期结束,开始上课

})

}, 1000)

// race方法,用法与all一样,只是all是等所有的异步操作完成之后,才会执行then回调.而race回调的话只要有一个异步操作执行完毕,就立刻执行then回调;

//then方法里面的回调中的参数data是一个数组,我们可以得到异步执行操作的结果

// PS:其他没有执行完毕的异步操作,仍然会继续执行,而不是停止

setTimeout(() => {

Promise.race([study(), test()])

.then(function(data) {

console.log("考试不考试,学习不学习,都没关系的")

})

}, 20000)

// race的使用场景很多,例如我们可以给某一个race设置请求超时时间

//考研开始,5s内交卷认为合格,否则认为不合格

function passTheExam() {

var p = new Promise(function(resolve, reject) {

setTimeout(() => {

resolve("交卷")

}, 25000);

})

return p;

}

function requestTimeOut() {

var p = new Promise(function(resolve, reject) {

setTimeout(() => {

reject("考试失败")

}, 30000);

})

return p;

}

Promise.race([passTheExam(),requestTimeOut()])

.then(function(data){

console.log(data);

})

.catch(function(err){

console.log(err);

})

</script>

</body>

</html>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • Promise 对象 Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函...
    neromous阅读 8,698评论 1 56
  • 一、Promise的含义 Promise在JavaScript语言中早有实现,ES6将其写进了语言标准,统一了用法...
    Alex灌汤猫阅读 818评论 0 2
  • 本文适用的读者 本文写给有一定Promise使用经验的人,如果你还没有使用过Promise,这篇文章可能不适合你,...
    HZ充电大喵阅读 7,296评论 6 19
  • 特点 Promise能将回调分离出来,在异步操作执行之后,用链式方法执行回调,虽然es5用封装函数也能实现,但是如...
    一二三kkxx阅读 615评论 0 1
  • 前言 本文旨在简单讲解一下javascript中的Promise对象的概念,特性与简单的使用方法。并在文末会附上一...
    _暮雨清秋_阅读 2,180评论 0 3