Promise是什么
按照用途来解释
- 主要用于异步计算。
- 可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果。
- 可以在对象之间传递和操作Promise,帮助我们处理队列。
异步回调
回调有四个问题
- 嵌套层次很深,易形成“回调地狱”,难以维护。
- 无法正常使用 return 和 throw。
- 无法正常检索堆栈信息。
- 多个回调之间难以建立联系。
Promise简介
初始化一个Promise实例
new Promise(
/* 执行器 executor */
function (resolve, reject) {
// 一段耗时很长的异步操作
resolve(); // 数据处理完成
reject(); // 数据处理错误
}
).then(function A() {
// 成功,下一步
}, function B() {
// 失败,做相应处理
})
Promise详解
- Promise是一个代理对象,它和原先要进行的操作并无关系。
- 它通过引入一个回调,避免更多的回调。
Promise有三个状态:
- pending [待定] 初始状态(创建实例时,new Promise)
- fulfilled [实现] 操作成功(调用resolve)
- rejected [被否决] 操作失败(调用reject)
Promise状态发生改变,就会触发.then()里的响应函数处理后续步骤。
Promise状态一经改变,不会再变。
Promise实例一经创建,执行器立即执行。
假如一个Promise已经完成,再.then() 会怎样?
console.log('start');
let promise = new Promise(resolve => {
setTimeout(() => {
console.log('the promise fulfilled');
resolve('hello world');
}, 1000)
})
setTimeout(() => {
promise.then(value => {
console.log(value)
})
}, 3000)
// start
// the promise fulfilled
// hello world
假如在.then() 的函数里面不返回新的Promise,会怎样?
.then()
- .then()接受两个函数作为参数,分别代表fulfilled和rejected
- .then()返回一个新的Promise实例,所以它可以链式调用
- 当前的Promise状态改变时,.then()根据其最终状态,选择特定的状态响应函数执行
- 状态响应函数可以返回新的Promisem,或其他值
- 如果返回新的Promise,那么下一级.then()会在新的Promise状态改变之后执行
- 如果返回其他任何值,会立即执行下一级.then()
网友评论