很早之前就听说过promise了,但是一直没有时间深入研究。这两天有时间看了一下,下面就我自己的理解整理一下promise的相关知识。
一,为什么使用Promise?
promise是js解决异步操作的一种方案,和回调函数一样都是用来处理异步操作的。那为什么不继续使用回调函数而用promise代替呢?
因为用回调函数的话,代码逻辑会有点乱,它是横向编写的,如果回调函数里的操作还是异步回调的话,就会形成回调地狱。而用promise的话,同样是处理异步操作,promise的逻辑会很清晰,我们会容易理解,promise本质是处理异步操作,只是转变了思维和形式。用处理同步的方式处理异步操作。也就是形式上像同步操作,而本质是异步操作。
二,promise/a+规范
因为回调地狱的困扰,社区就出现了Promise/a+规范,是实现promise的必须遵循的规范。它只是一些规范,所以在不同的框架或平台下都有不同的实现。实现了Promise/a+的库有:Angular的$q服务,Node中的q模块,ES6自带的Promise,还有async库,await等。
因为菜鸟对规范不是很精通,只能用通俗的语言来描述promise/a+规范。规范的内容如下:
1,不管进行什么操作,都返回一个promise对象,这个对象里会有一些属性和方法,
2,Promise对象有三个状态:未完成,已完成,失败。初始化的promise对象的状态为未完成,未完成状态的转变路径只有两条,只能从未完成—>已完成,或者未完成---->失败。状态一旦改变则不会再改变。
3,这个promise对象使用时必须通过then方法调用,它是实现异步的链式操作的基础。
这个规范刚开始可能看的有点糊涂,不知道在说什么,不要着急,在我们初步了解,熟练使用promise之后,再自己实现一个Promise的时候才会慢慢理解它的含义。
三,Promise常用方法总结
说了这么多,Promise到底是个啥东西?在控制台console.dir(Promise);我们就会看到,Promise是一个构造函数。
在Promise的构造函数上有all,race,reject,resolve方法,在Promise的原型上有then,catch方法,也就是构造的promise实例对象可以执行then方法和catch方法。
我们创建一个promise实例。
var p =new Promise (function (resolve, reject) {
"use strict";
var a =10;
if (a >0) {
resolve (a )
}else {
reject (a )
}
} );
p.then (function (data) {
"use strict";
console.log ("已完成")
console.log ( data )
},function () {
"use strict";
console.log ("失败")
} );
resolve和reject是用来改变promise的状态的。
Promise的构造函数接收一个参数,是函数,并且传入两个参数:resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数。按照标准来讲,resolve是将Promise的状态置为fullfiled,reject是将Promise的状态置为rejected。
then方法接收两个可选函数参数,如果promise的状态为fullfiled时,第一个函数执行,如果promise的状态为rejected,第二个函数执行。如果只有一个参数,默认为fullfiled状态执行的函数。
网友评论