Javascript 有很多强大的功能,其中一个就是它可以轻松的搞定异步编程。Node.js 用回调函数代替了事件,使异步编程在 js 领域更加流行。但当更多的程序开始使用异步编程时,事件和回调函数却不能满足开发者想要做的所有事情,而 Promise 就是这些问题的解决方案。
Promise
Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。所谓 Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。
多么强大的东西都有浏览器兼容性的问题:
优点和缺点
优点:可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise 对象提供统一的接口,使得控制异步操作更加容易。
缺点:首先,无法取消 Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。当处于 Pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
Promise 的生命周期
每一个 Promise 都会经历一个短暂的生命周期:先是处于进行中 pending(Promise 对象的初始状态,等到任务的完成或者被拒绝)状态,此时操作未完成,所以它也是未处理的;一旦异步操作执行结束,promise 就会进入以下两种状态中的一种:Resolved 又称 fulfilled(任务执行完成并且成功的状态);Rejected(任务执行完成并且失败的状态)。
Promise 的状态只可能从 Pending 状态转到 Resolved 状态或者 Rejected 状态,而且不能逆向转换,同时 Resolved 状态和 Rejected 状态也不能相互转换。
Then()方法
所有的 Promise 都有 then()方法,且同一个 Promise 对象可以注册多个 then 方法,它接受两个可选参数:第一个是当 Promise 的状态变为 resolved 时要调用的函数;第而个是当 Promise 的状态变为 rejected 时要调用的函数。
注意事项:如果省略这两个参数,或者提供非函数,那么将创建一个没有其他处理程序的新 Promise,只是采用 Promise 的最终状态,then 被调用。
如果省略第一个参数或提供的不是函数,创建的新 Promise 简单地采用 Promise 的完成状态,then 被调用(如果它变为完成)。
如果省略第二个参数或提供的不是函数,创建的新 Promise 简单地采用 Promise 的拒绝状态,then 被调用(如果它被拒绝)。
Then 方法返回的是一个新的 promise 对象,因此可以采用链式写法;
下面这个例子使用 then 方法依次指定了两个回调函数,第一个函数执行完,执行第二个回调函数,实现依次打印 1,2,3
本文转载自 Think 体验设计公众号。
原文链接:https://mp.weixin.qq.com/s/oZ-VCAXsboTx5cph4oAMVw
评论