Promise 对象的出现,大家都知道是为了解决"回调函数地狱"(callback hell)。它不是新的语法功能,而是一种新的写法,允许将回调函数的嵌套,改成链式调用。我试着用思维导图的方式整理了一下Promise的基本用法。
ES6 规定,Promise对象是一个构造函数,用来生成Promise实例,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。
Promise 新建后就会立即执行,如果调用resolve函数和reject函数时带有参数,那么它们的参数会被传递给回调函数。
注意点:
1.调用resolve或reject并不会终结 Promise 的参数函数的执行:
因为立即 resolved 的 Promise 是在本轮事件循环的末尾执行,总是晚于本轮循环的同步任务。
一般来说,调用resolve或reject以后,Promise 的使命就完成了,后继操作应该放到then方法里面,而不应该直接写在resolve或reject的后面。所以,最好在它们前面加上return语句,这样就不会有意外。
2.最好不要在then方法里面定义 Reject 状态的回调函数(即then的第二个参数),总是使用catch方法:
上面代码中,第二种写法要好于第一种写法,理由是第二种写法可以捕获前面then方法执行中的错误,也更接近同步的写法(try/catch)。因此,建议总是使用catch方法,而不使用then方法的第二个参数,catch方法返回的还是一个 Promise 对象,因此后面还可以接着调用then方法。
跟传统的try/catch代码块不同的是,如果没有使用catch方法指定错误处理的回调函数,Promise 对象抛出的错误不会传递到外层代码,即不会有任何反应。Promise 内部的错误不会影响到 Promise 外部的代码,通俗的说法就是“Promise 会吃掉错误”。因此Promise 对象后面总是要跟catch方法,这样可以处理 Promise 内部发生的错误。
Promise 的最大问题是代码冗余,原来的任务被 Promise 包装了一下,不管什么操作,一眼看去都是一堆then,原来的语义变得很不清楚,更好的方法是:Generator函数,async函数
参考文章链接: