对Promise的深情,只好浅谈

750 阅读3分钟

对Promise的深情,只好浅谈

谢时间拈了眉头的霜花,谢沧桑 喂饱思念的马,谢绵长情话 投射了天涯,带我去探索Promise,让偶在红尘中,啊,不,在Promise中醉一下。

回调的前世今生,让你再见不必害怕

我相信当每个人遇到Promise的那一刻,在你身上产生了一种由内而发的情感,叫作承诺,叫作心动。那么,故事就由此开始了。

故事的发生产生的一个行为,包括了三个阶段

阶段1:什么是Promise?

Promise是基于es6的,在之前的版本中是没有的,像koa中的generator,还有后来的async、await、axios 、redux-saga,要想深入理解运用,Promise是关键,那么Promise到底怎么理解呢?

Promise本意是承诺,在程序中的理解呢,就是它是一种异步流程的控制手段,我们都知道js中常见异步有:定时器,callback,ajax请求,那怎么理解异步呢?古人云:“君子一言,驷马难追!”,这句话,就是形容,一个人答应另一个人,在将来一定会实现的诺言,就是Promise要做的事情。简而言之,异步就是,过一段时间确认必须要做的事情。

阶段2:Promise的三个状态
  • Pending: Promise对象实例创建时候的初始状态
  • Fulfilled可以理解为成功的状态
  • Rejected可以理解为失败的状态
  1. then方法就是用来指定Promise对象的状态改变时确定执行的操作,resolve时执行第一个函数(onFulfilled),reject时执行第二个函数(onRejected).
  2. Promise只有一个参数,叫excutor执行器,默认new时就会调用

下面我们来看一段代码:


   Let p = new Promise((resolve, reject) => { 
     // 默认promise中的executor是同步执行的
      resolve(‘成功的回调’); 
     //reject(’失败的回调’);
   });
   p.then((value) => { // vlaue成功的原因
       console.log(value); // ‘成功的回调’
    },(err)=>{ //err失败的原因
       console.log(err);  //  ’失败的回调’
   })

阶段3:Promise解决回调地狱

首先,先解释一下什么是回调地狱,我们经常会遇到这样的情况:一个接口的参数会需要使用另一个接口获取,之前通常采取的方法,就是ajax里面嵌套ajax,这样做也能解决此问题,但是给开发者还来了痛苦的回忆,而且用户体验极差,现在,我们终于迎来了Promise的时代,它完美的解决了回调地狱。

下面我们来看一下,它的实现方式:


    let fs = require('fs');
    function read(file){
        return new Promise(function(resolve,reject){
            fs.readFile(file,'utf8',function(err,data){
                if (err) {
                    return reject(err);
                }
                resolve(data);
            })
        })
    }   
    read('./1.txt').then(function(data){
        return read(data);
    }).then(function(data){
        console.log(data);
    }).catch(function(err){
        console.log(err)
    })

当第一个then中返回一个promise,会将返回的promise的结果,传递到下个then中。这就是比较著名的链式调用了。

好了,到这里,故事接近尾生啦,希望通过上述的三点,让大家能对promise有一个简单的了解,想知道Promise的更多内容吗?请继续关注我给大家带来的后续文章。