小白的时候看了很多关于Promise介绍的文档。一直没能明白什么叫解决异步操作的痛点,直到看了第一篇谷歌页面全是中文文档才顿悟。其实从它的英文字面意思来理解是最简单粗暴的。这是一个promise,相当于在代码中提供了一种方式,可以在promise之后随时做一些事情。这个承诺可能兑现也可能不兑现。当然也可以用这个来代替我们以前在提现过程中写的回调函数,这样可以避免JavaScript程序中的回调地狱。所以先不学习语法,而是换个方式去理解,希望能帮助大家更好的学习或者上手Promise。什么是承诺?Promise是一种异步编程的解决方案,可以替代传统的解决方案,例如回调函数和事件。它在ES6中统一使用,并提供了原生的Promise对象,Promise对象代表了异步操作的最终完成(或失败)及其结果值。Promise作为一个对象,有以下两个特点:对象的状态不受外界影响,只有异步操作的结果才能确定当前处于哪个状态。任何其他操作都无法改变这个状态,即也是Promise这个名字的由来。它的英文意思是promise,意思是其他手段无法改变状态。一旦状态改变,它就不会改变。也就是说,Promise在任何时候只有一个状态pending:初始状态,不是成功或失败状态;fulfilled(已解决):操作成功完成的状态;rejected:操作失败的Promise对象的状态,只有两种可能:从Pending到Resolved和从Pending到Rejected,只要这两种情况发生,状态就会被冻结,不会再发生变化。这个结果会一直保持下去。即使变化已经发生,如果你给Promise对象添加一个回调函数,你也会立即得到这个结果。这与事件(Event)完全不同。活动的特点是错过了再去听。Promise的创建和使用是不会得到结果的。构造函数接受一个名为executor的函数。这个执行函数接受两个f函数参数,resolve和reject。newPromise(/*执行者*/function(resolve,reject{...}));Promise通常用于阻塞代码和异步操作,包括文件调用、API调用、DB调用、IO调用等。启动发生在执行函数中。如果异步操作成功,promise的创建者调用resolve()函数返回预期的结果。同样,如果发生意外错误,则通过调用reject()函数传递错误特定信息,因为承诺将立即执行,我们无法检查承诺的初始状态,因此创建需要时间执行的承诺的最简单方法是使用setTimeOut()函数。通过浏览器控制台的输出,可以直观的看到上述状态及其变化过程varpromiseFir=newPromise(function(resolve,reject){setTimeout(function(){resolve({message:'很高兴分享知识与你同在!',code:200});},2000)})console.log(promiseFir);setTimeout(function(){console.log(promiseFir);},2000)Promise方法3原型方法Promise.prototype.then(onFulfilled,onRejected)链式操作Promise.prototype.catch(onRejected)catcherrorPromise.prototype.finally(onFinally)最后的操作下面通过一个小例子来快速了解这三个原型方法的用法//以一个小故事为例,你是一个上学的孩子,你向妈妈要电话。她说:我这个月底要买手机varmomsPromise=newPromise(function(resolve,reject){momsSavings=20000;//不能买礼物因为妈妈没有足够的积蓄//momsSavings=200000;//如果妈妈有足够的积蓄买礼物priceOfPhone=60000;if(momsSavings>priceOfPhone){resolve({brand:"iphone",model:"6s"});}else{reject(“我们没有足够的积蓄,让我们存更多的钱吧。");}});momsPromise.then(function(value){console.log("哇,我得到了这个手机作为礼物",JSON.stringify(value));});momsPromise.catch(function(reason){console.log("妈妈不能给我买手机因为",reason);});momsPromise.finally(function(){console.log("不管妈妈能不能给我买手机,我还是爱她");});4个静态方法Promise.resolve()Promise.reject()Promise.all()Promise.race()Promise.prototype.then(onFulfilled,onRejected)Promise.prototype.then()方法返回一个新的Promise对象,所以可以使用chained方法,Promise.prototype.then()方法有以下三个参数:成功回调,失败回调,高级回调,一般只需要实现第一个,后面是可选的functionptFir(){returnnewPromise(function(resolve,reject){setTimeout(function(){console.log('方法1执行');resolve('方法11已被执行');},2000)})}functionptSec(){returnnewPromise(function(resolve,reject){setTimeout(function(){控制台。log('方法2执行');resolve('方法2执行完成');},1000)})}functionptThi(){returnnewPromise(function(resolve,reject){setTimeout(function(){console.log('方法3执行');resolve('方法3执行完成');},3000)})}ptFir().then(function(data){console.log('第一个回调:'+data);returnptSec();}).then(function(data){console.log('第二次回调:'+data);returnptThi();}).then(function(data){console.log('第三次回调:'+data);return'还没结束?已经结束了!';}).then(function(data){console.log(data);})Promise.prototype.catch(onRejected)捕获错误Promise.prototype.catch()方法是Promise.prototype.then(null,rejection)的别名,用于指定Promise对象发生错误时的回调函数错误具有“冒泡”性质,会向后传递,直到被捕获,即,错误总是会被下一个catch语句捕获promise().then(function(data){//todosomething}).catch(function(err){//处理最后一个回调函数的错误})Promise.prototype.finally(onFinally)final操作不关心promise对象的最终状态,在在执行了.then或catch指定的回调函数后,finally方法指定的回调函数promise()就会被执行。then(function(data){//todosomething}).catch(function(err){//处理之前回调函数的错误}).finally(function(result){//处理后必须执行的操作then/catch})Promise.resolve()/Promise.reject()这两个是Helpermethodsorshortcuts,可以帮助你轻松创建resolve和reject方法.需要注意的是,如果Promise.resolve()方法的参数不是带有.then()方法的对象(也称为thenable对象),则返回一个新的Promise对象,其状态为fulfilled;如果Promise.resolve方法的参数是一个Promise对象的实例,它将被原封不动地返回。Promise.reject()方法同上varpromise=Promise.resolve('您好,这里是执行成功的内容!');//varpromise=Promise.reject('出了点问题,这是找到的错误!');//成功和失败只有一种状态promise.then(function(data){console.log(data)});promise.catch(function(err){console.log(err)});Promise.all()当当你处理多个承诺时,最好先创建一个承诺数组,然后对这些承诺集执行必要的操作。Promise.all(iterable)方法返回一个Promise实例。此实例的可迭代参数中的所有承诺都已解决(resolved)或者当参数不包含承诺时,回调完成(resolve)。如果参数中的承诺之一失败(拒绝),则此实例回调失败(拒绝)。失败的原因是第一个失败的承诺的结果。笔记!!!这里的异步操作是并行执行的,直到全部执行完才会进入then(),而all()方法会将所有异步操作的结果放入一个数组中传递给then()。下面的例子只需要说明三个方法的状态变为fulfilled,p的状态变为fulfilled。此时三个方法的返回值组成一个数组,传递给p的回调函数只需要三个方法中的一个被拒绝即可。状态变为拒绝。此时第一个被拒绝的实例的返回值会传递给p的回调函数);resolve('方法一执行完成');},2000)})}functionptSec(){returnnewPromise(function(resolve,reject){setTimeout(function(){console.log('方法二执行');resolve('方法2执行完成');},1000)})}functionptThi(){returnnewPromise(function(resolve,reject){setTimeout(function(){console.log('方法3执行');resolve('方法3执行完成');},3000)})}Promise.all([ptFir(),ptSec(),ptThi()]).then(function(data){console.log(data);console.log({}.toString.call(data));})承诺。race()Promise.race(iterable)方法返回一个承诺。一旦迭代器中的承诺被解决或拒绝,返回的承诺将解决或拒绝all()方法。谁执行回调”,那么还有一个方法“谁跑得快,谁就执行回调”,这就是race()方法,这个词本来就是赛跑的意思。race()方法是什么?用它?有还有很多使用场景,比如我们可以使用race()为异步请求设置一个超时时间,超时后执行相应的操作//ptFir(),ptSec(),ptThi()同上Promise.all([ptFir(),ptSec(),ptThi()]).then(function(data){console.log(data);console.log({}.toString.call(data));})一些经验法则使用Promises在执行异步操作或使用阻塞代码时,请使用Promise,为了代码的可读性,resolve()方法对待.then(),reject()方法对应.catch(),保证两者。catch()和.then()方法来实现所有的承诺如果在这两种情况下都需要做某事,请使用.finally()我们每个承诺只有一个变化(单一原则)我们可以添加多个处理程序sinonepromisePromise对象从所有方法中返回返回类型,不管是静态方法还是原型方法,都是Promise。在all()方法中,无论哪个promise没有先实现,promise的顺序都保存在value变量中。参考文档2————深入浅出理解Promise中的then参考文档3————理解Javascript中的Promise参考文档4——JavaScriptPromiseObject我是fx67ll.com,如果您发现本文有错误,欢迎讨论并在评论区指正,感谢阅读!如果您喜欢本文,欢迎访问我本文的github仓库地址,并为我点个Star,谢谢~:)转发请注明参考文章地址,万分感谢!!!