记录学习|Promise

131 阅读1分钟

在之前的面试过程中,经常会被问到如何解决异步地狱回调?Promise的使用方法?又或者是你可以手写Promise吗?今天就结合之前的使用以及在网上对多个技术博客的学习,对自己理解的Promise进行一个总结。

什么是Promise

ES6原生提供了Promise对象,Promise对象代表了未来将要发生的事情,用来传递异步操作的消息。并且Promise提供了统一的API,各种异步操作都可以使用同样的方法进行处理。

但是Promise又存在着一些缺点,包括:1.无法取消。一旦创建就会立即执行,无法中途取消。2.如果不设置回调函数,Promise内部会抛出错误,但是却不会显示在外部。3.处于pending状态的时候,无法知道现在是进展到哪一个阶段。

在Promise出现之前,这种情况都是由回调函数来进行解决的,但是层层嵌套的回调函数又容易导致掉进回调地狱。如下:

    const fs = require('fs');
    fs.readFile('1.txt',(err,data)=>{
      fs.readFile('2.txt',(err,data)=>{
        fs.readFile('3.txt',(err,data)=>{
                   //....
        });
      });
    });

使用Promise对上述代码进行重写后:

   const readFile = function(fileName){
      return new Promise((resolve,reject)=>{
          fs.readFile(fileName,(err,data)=>{
              if(err){
                 reject(err)
              }
              else{
                resolve(data)
              }
          })
      })   
   }
   
   readFile('1.txt').then(data=>{
      return readFile(2.txt);
   }).then(data=>{
      return readFile(3.txt);
   }).then(data=>{
      //...
   })

Promise规范

es6采用的是Promise/A+规范。es6还引入了Promise.all、Promise,race、Promise,catch、Promise.resolve、Promise.reject等方法。

Promise的基本结构

平时对Promise的使用

   var fn = new Promise(function(resolve,reject){
       console.log('start');
       setTimeout(function(){
          resolve(2)
       },1000)
   })
   fn.then(function(res){
      console.log('suc',res)
   },function(err){
   console.log('err',err)
   )}