名词约定
promise的话,有以下名词约定:
promise
(首字母小写)对象指的是"Promise实例对象"Promise
(首字母大写且单数形式)表示"Promise构造函数"Promises
(首字母大写且复数形式)用于指代"Promises规范"
一、什么是promise:
-
从语法和本质上来说的话,promise是一个构造函数,对外提供统一的API,自己身上有all、reject、resolve等方法,原型上有then、catch等方法。
-
JS中常见的异步操作:定时器、AJAX中一般也是异步操作(也可以同步),回调函数可以理解为异步(不是严禁的异步操作等...)
二、Promise的两个特点
- Promise对象的状态不受外界影响
1)pending
初始状态(也就是未决定的)
2)fulfilled
或 resolved
成功状态
3)rejected
失败状态
Promise有以上三种状态,只有异步操作的结果可以决定当前是哪一种状态,其他任何操作都无法改变这个状态。
- Promise的状态一旦改变,就不会再变,任何时候都可以得到这个结果,状态不可以逆,只能由pending变成fulfilled或者rejected(说白了就是:一个promise对象只能改变一次,无论成功或者失败都会有一个结果数据。成功称为value;失败称为reason)
三、为什么要使用Promise呢?
- promise使用回调函数更灵活,旧的回调函数必须在启动异步任务之前指定。
- promise:启动异步任务 => 返回promise对象 => 给promise对象绑定回调函数(甚至能在异步任务结束后指定多个)
- promise支持链式调用,可以完美的解决回调地狱的问题。(回调地狱就是多层回调函数嵌套使用,说白了就是套娃,这样就不利于阅读和异常处理)
四、使用new来创建一个promise对象
Promise接受一个「函数」作为参数,该函数的两个参数分别是resolve和reject。这两个函数就是就是「回调函数」
resolve函数的作用:在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
reject函数的作用:在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
const promise = new Promise((resolve, reject) => {
// do something here ...
if (success) {
resolve(value); // fulfilled
} else {
reject(error); // rejected
}
});
五、Promise的API使用:
- Promise 的构造函数:Promise(executor){}
(1)executor 函数:执行器 (resolve,reject)=> {}。
(2)resolve 函数:内部定义成功时调用函数 value => {} 。
(3)reject 函数:内部定义失败时调用函数 reason => {} 。
注意:Promise内部会立同步即调用executor,异步操作在执行器里执行。
-
then()
方法:Promise.prototype.then(onResolved, onRejected)=> {}
(1) onResolved 函数:成功的回调函数 (value) => {}
(2) onRejected 函数:失败的回调函数 (reason) => {}
注:指定用于得到成功value的成功回调和用于得到失败reason的失败回调是返回一个新的promise对象。
-
catch()
方法:Promise.prototype.catch (onRejected) => {}
onRejected.函数: 失败的回调函数(reason)=> {}
注:只是失败的调用。then()的语法糖,相当于: then(undefined, onRejected)。
-
resolv()
方法:Promise.resolve(value)=> {}
value: 成功的数据或promise对象
注:如果传入的参数为非Promise类 型的对象,则返回的结果为成功promise对象,如果传入的参数为Promise 对象,则参数的结果决定了resolve 的结果。
-
reject()
方法:Promise.reject(reason) => {}
reason: 失败的原因
注:无论传入啥只返回一个失败的promise对象。
-
all()
方法:Promise.all(promises)=> {}
promises: 包含n个promise的数组
注:返回一个新的promise,只有所有的promise都成功才成功,只要有一个失败了就直接失败。失败了返回那个失败值。
-
race()
方法:Promise.race(promises)=> {}
promises: 包含n个promise的数组
注:返回一个新的promise,第一个完成的promise的结果状态就是最终的结果状态。
来一个例子:
let p1 = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('yes');
},1000)
})
let p2 = Promise.resolve('success');
let p3 = Promise.resolve('come');
const result = Promise.race([p1,p2,p3]);
console.log(result);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。