Promise(1)—3分钟掌握最基本的Promise原理

前言

学习是一个漫长的过程,须要按部就班,要想深刻的理解一门技术,须要沉下心来慢慢研究。要作到经过现象看本质,学Promise的同时也会用到高阶函数和发布订阅,只有掌握了那些通用的技术,才可以更有效的学习下去,更好的看到本质。慢慢的你会发现经过深刻学习一个Promise,收获的却不仅是Promise。 编程

1、什么是Promise

Promise 是异步编程的一种解决方案,Promise对象是一个构造函数,用来生成Promise实例. promise

2、Promise对象有如下两个特色。

一、有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败) 只有异步操做的结果,能够决定当前是哪种状态,任何其余操做都没法改变这个状态bash

二、一旦状态改变,就不会再变,Promise对象的状态改变:只有两种可能: 从pending变为fulfilled和从pending变为rejected。只要这两种状况发生,状态就凝固了,不会再变了,会一直保持这个结果异步

3、Promise的实现(ES5)

一、名词解释:

一、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。

持续更新···

相关文章
相关标签/搜索