promise 基本流程
为什么要用 Promise
1. 指定回调函数的方式更加灵活
- 旧的: 必须在启动异步任务前指定
- promise: 启动异步任务 => 返回promie对象 => 给promise对象绑定回调函数(甚至可以在异步任务结束后指定/多个)
2. 支持链式调用, 可以解决回调地狱问题
-
什么是回调地狱?
回调函数嵌套调用, 外部回调函数异步执行的结果是嵌套的回调执行的条件
-
回调地狱的缺点?
- 不便于阅读
- 不便于异常处理
-
解决方案?
promise 链式调用
-
终极解决方案?
async/await
promise 注意事项
1. promise 函数体里面是立即执行的,异步操作(resolve/reject)在执行器中执行
var p = new Promise((resolve, reject) => {
console.log('kkkkkkk');
setTimeout(() => {
resolve('sss');
}, 1000);
});
console.log('#####');
输出结果:可暗处kkkkkk先打印,再过来#####
2. then方法的返回参数可以是promise对象,也可以是非promise对象。
普通的方法函数
- 返回值为null 返回成功的promise, 返回结果值为null
- 如果返回的参数为 非Promise类型的对象, 则返回的结果为成功promise对象,值为返回参数
- 可以通过throw 'error' 来返回错误的promise对象
- 如果传入的参数为 Promise 对象, 则参数的结果决定了 resolve 的结果
注意: 如果then的值不是方法,是promise对象,那么then的返回结果值还是上一个的promise返回结果值
function test() {
return new Promise((resolve, reject) => {
resolve('kkkk');
})
}
var p = new Promise((resolve, reject) => {
resolve('sss');
})
console.log(test().then(p));
他的输入结果:
Promise.resolve和Promise.reject方法
Promise.resolve
- 如果传入的参数为 非Promise类型的对象, 则返回的结果为成功promise对象
- 如果传入的参数为 Promise 对象, 则参数的结果决定了 resolve 的结果
Promise.reject
- 无论传递的是什么参数,返回都是失败的promise对象。返回值就是他传递的的值