当前位置: 首页 > Web前端 > HTML

解答疑惑——Promise

时间:2023-04-02 19:20:54 HTML

Promise本章主要讲解promise大部分人有疑惑的几个地方,或者说可能和你想象的不一样的地方,所以需要对promise有一定的基础,最好用在项目。在开始之前,先跟大家确认一个概念:决心。决议是对应许的判断。比如reslove()或者reject()执行时,promsie被判断为状态,或者判定为promise语法格式语法格式我们都知道,也经常用到。比如我们最常用的写法letpromise=newPromise((resolve,reject)=>{//做一些事情console.log(a);resolve();});promise.then(()=>{console.log('runsuccess');}).catch(()=>{console.log('runfail');})这种格式没有错。而且在很多书上都有推荐。特别是链式写作(then-then-catch)。但是promise的格式其实不是这样的。它应该看起来像这样。letpromise=newPromise((resolve,reject)=>{//做一些事情console.log(a);resolve();});promise.then(()=>{console.log('运行成功');},()=>{console.log('runfail')}).catch(()=>{console.log('runfail');})then这个参数里应该有两个(两个回调,一个接收成功解决方案,一个接收失败解决方案)。只是我们经常省略第二个参数,或者为了代码写的方便,看起来舒服,我们是故意的。看完你可能会想,这有什么意义,不就是少写了一个callback吗。这在写代码的时候确实没什么用,但是理解promises中的一些东西是很重要的(下面会引用这个例子)。在这里我可以问你一个问题:为什么catch可以catch之前报的几个错误呢?有一次做决定之前,同事问了这样一个问题:为什么下面的代码执行成功,为什么不进入catch(方法b会抛出异常)?你知道为什么吗?console.log('here')newPromise(resolve=>{resolve()console.log('000')b()}).then(value=>{console.log('success');}).catch(error=>{console.log('Erro123r',error.message)})functionb(){console.log(999)thrownewError('123')}这是promise最重要的特性之一.决议一经作出,不得更改。所以这道题的核心是先执行reslove(),再执行方法b。执行reslove的决定已经做出,b的错误不能再改了。所以只能去,不能追。如果我们要进入catch,只需要在resolve之前执行b方法,错误就会被promise先解决。Promise只解析一次,这是我们可以放心使用的保证,否则我们要考虑这个时候解析的结果是什么。我可以放心大胆的写如下:可以写多个then,不用担心分辨率改不了,then不会执行。functionbar(){//做某事}functionfoo(){//做某事}letp=newPromise((resolve,reject)=>{//做某事resolve();})p.then(bar);p.then(foo);...为什么catch能捕获then之前报的几个错误?先看一下链式结构,省略then中的回调方法。letp=Promise.resolve();p.then().then().then().then().catch()链式结构就这样。看到这个结构就解决了一个很多人会理解错的常见误区(p的解析被拒绝,然后catch会直接执行)。从这个链式结构来看,我们的代码不可能不执行then就执行,或者跳过前面的then,直接执行catch。我们只能链式调用,一个然后,一个然后调用。直到调用最后一个catch。至此我们得到一个重要的结论:无论解析成功与否,then方法都会被执行。这时候可能有人会疑惑,如果then都执行了,then里面的回调不就执行了吗?这是我们在第一部分中介绍的promise的格式。then里面有两个参数(成功回调,失败回调)。一旦解析失败,就会执行then中的失败回调。但一般情况下,我们不写失败回调。Promise会自动添加一个失败回调,并将失败状态传递给下一个then。一条一条往下传,只要后面的then不写失败回调,就会一直往下传,直到遇到catch。这就是为什么catch可以捕获之前报告的几个错误的原因。这些是我花很多时间学习,同时花很长时间编码的词。我希望它能帮助你理解承诺。关注欢迎关注小站小滑轮,小站是平时工作中积累的一些小工具。你在工作中是否也遇到过?也可以在博客下方留言小站内容。如果你想让我添加你使用的任何工具,你也可以留言。