学习是一个漫长的过程,须要按部就班,要想深刻的理解一门技术,须要沉下心来慢慢研究。要作到经过现象看本质,学Promise的同时也会用到高阶函数和发布订阅,只有掌握了那些通用的技术,才可以更有效的学习下去,更好的看到本质。慢慢的你会发现经过深刻学习一个Promise,收获的却不仅是Promise。 编程
Promise 是异步编程的一种解决方案,Promise对象是一个构造函数,用来生成Promise实例. promise
一、有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败) 只有异步操做的结果,能够决定当前是哪种状态,任何其余操做都没法改变这个状态bash
二、一旦状态改变,就不会再变,Promise对象的状态改变:只有两种可能: 从pending变为fulfilled和从pending变为rejected。只要这两种状况发生,状态就凝固了,不会再变了,会一直保持这个结果异步
一、executor:为执行器当new Promsie(executor)的时候,executor做为同步代码当即执行。异步编程
二、status:Promise实例的三个状态pending(进行中)、fulfilled(已成功)和rejected(已失败)函数
三、value:这个是成功传递的参数,成功有成功的值。学习
四、reason:这个是失败时候传递的参数,失败有失败的缘由。ui
五、resolve:一个成功时调用的函数,做为参数传递给executor,为高阶函数this
六、reject:一个失败时调用的函数,做为参数传递给executor,为高阶函数spa
代码解读:
在Promise当中,定义好状态,成功的值,和失败的缘由,当你传入
function(resolve,reject){resolve('成功了')}的时候resolve做为回调函数,
被触发执行了,而后以前定义的状态pending(等待)变成了fulfilled(成功),
此时调用then方法传入两个callback,经过内部比对if来执行onFulfilled或
onRejected。
function Promise(executor){
const self = this;
self.status = 'pending';//promise 状态
self.value = undefined;// 成功有成功的值
self.reason = undefined;// 失败有失败的缘由
function resolve(value){
if(self.status === 'pending'){ //只有pending状态下才能够改变状态
self.status = 'fulfilled';
self.value = value;
}
}
function reject(reson){
if(self.status === 'pending'){//只有pending状态下才能够改变状态
self.status = 'rejected';
self.reason = reson;
}
}
try{
executor(resolve,reject); // 此处为高阶函数,一个函数内传入其余函数,这就是高阶函数的一种
}catch(err){
reject(err);
}
}
Promise.prototype.then = function(onFulfilled,onRejected){
if(this.status === 'fulfilled'){
onFulfilled(this.value);
}
if(this.status === 'rejected'){
onRejected(this.reason);
}
}
复制代码
上述代码能够正常运行如下代码:
const p = new Promise((resolve,reject)=>{
resolve('成功')
// throw 1213
// reject('失败')
});
p.then(function(data){
console.log(data) // 成功
},function(err){
console.log(err) // 失败 或 1213
})
复制代码
到这里最基本的Promise已经封装完成了,是否是很简单。
const p = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('我是异步的成功')
})
});
复制代码
学习是一个漫长的过程,须要按部就班,要想深刻的理解一门技术,须要沉下心来慢慢研究。要作到经过现象看本质,学Promise的同时也会用到高阶函数和发布订阅,只有掌握了那些通用的技术,才可以更有效的学习下去,更好的看到本质。慢慢的你会发现经过深刻学习一个Promise,收获的却不仅是Promise。