# promise是什么
- promise是异步编程的一种解决方案:
从语法上讲,promise是一个对象,从它可以获取异步操作的消息;
从本意上讲,它是承诺,承诺过一段时间会给你一个结果。
# promise的优缺点
# 优点:
指定回调函数的方式更灵活:
旧的方法:必须在启动异步任务之前指定回调
promise:启动异步任务 => 返回promise对象 => 给promise对象绑定回调函数支持链式调用:
将异步操作以同步操作的流程表达出来,可以解决回调地狱问题
回调地狱:函数作为参数层层嵌套
最好的解决办法是async/await
# 缺点:
无法取消promise
一旦新建它就会立即执行,无法中途取消必须设置回调函数
如果不设置回调函数,promise内部抛出的错误,不会反映到外部pending下无法得知具体状态
当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)
# 手写实现promise:
简易版
function myPromise(constructor) {
let self = this;
self.status = "pending" // 定义状态改变前的初始状态
self.value = undefined // 定义状态为resolved的时候的状态
self.reason = undefined // 定义状态为rejected的时候的状态
function resolve(value) {
// 两个==="pending",保证了状态是改变是不可逆的
if(self.status === "pending") {
self.value = value
self.status = "resolved"
}
}
function reject(reason) {
// 两个==="pending",保证了状态是改变是不可逆的
if(self.status == "pending") {
self.reason = reason
self.status = "rejected"
}
}
// 捕获构造异常
try{
constructor(resolve, reject)
}catch(e){
reject(e)
}
}
myPromise.prototype.then = function(onFullfilled, onRejected) {
let self = this;
switch(self.status) {
case "resolved":
onFullfilled(self.value)
break;
case "rejected":
onRejected(self.reason)
break;
default:
}
}
测试:
var p = new myPromise(function(resolve, reject) {
// resolve("ohohoho")
reject('because')
})
p.then(function(x) {
console.log(x);
},function(x) {
console.log(x);
})