Promise??What?

本来想直接写ES7的async-await的,后来一想这不就是Promise的语法糖吗,算了,还是写Promise吧。

首先我们先明确一下Promise的定义:

Promise对象用于异步操作,它表示一个尚未完成且预计在未来完成的异步操作。

我们都知道js是单线程的,一次只能执行一个任务。这就是同步模式。

而异步模式可以一起执行多个任务,异步任务会在当前脚本的所有同步任务结束后才会执行。

常见的异步任务有setTimeOut,ajax。

既然有了异步任务,那我们为什么还要用Promise?这就涉及到异步任务的执行顺序,如果执行多个有前后顺序的异步任务,代码就会非常难调试。而且,当我们在回调中需要使用结果再次进行回调,这就很难受了,这就是ES5的回调地狱。但还好,Promise使我们看到了希望。

Promise的真正强大之处在于它的多重链式调用,可以避免层层嵌套回调。


Promise基本用法

Promise对象代表一个未完成、但预计将来会完成的操作。

它有三种状态:

pending:初始值

fulfilled:代表操作成功

rejected:代表操作失败

promise

Promise实例生成以后,可以用then方法指定resolved状态和reject状态的回调函数。


then方法

Promise新建后就会立即执行。而then方法中指定的回调函数,将在当前脚本所有同步任务执行完才会执行


promise

上面的输出就是before-resolved    after-resolved    outer     resolved

promise对象的错误,会一直向后传递,直到被捕获。即错误总会被下一个catch所捕获。

.then()

Promise.prototype.then(onFulfilled,onRejected)

.catch()

语法:Promise.prototype.catch(onRejected)

promise.then(onFulfilled).catch(onRejected)


.then中产生的异常能在.catch中捕获


根据流程图,可以看出,A抛错时,会按照 taskA → onRejected → finalTask这个流程来处理。A抛错后,若没有对它进行处理,状态就会维持rejected,taskB不会执行,直到catch了错误。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Promise 对象 Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函...
    neromous阅读 8,731评论 1 56
  • Promiese 简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果,语法上说,Pr...
    雨飞飞雨阅读 3,392评论 0 19
  • Promise 的含义 一句话概括一下promise的作用:可以将异步操作以同步操作的流程表达出来,避免了层层嵌套...
    雪萌萌萌阅读 5,577评论 0 7
  • 目录:Promise 的含义基本用法Promise.prototype.then()Promise.prototy...
    BluesCurry阅读 1,503评论 0 8
  • 编后吐槽:写的快花眼,很详细,耐心看必受益匪浅 JavaScript的执行环境是「单线程」的。所谓单线程,是指JS...
    果汁凉茶丶阅读 4,667评论 8 27