promise函数的简单理解

148 阅读2分钟

众所周知,promise是一个用来解决异步编程的一个方案,翻了几篇文章谈谈自己的理解。

promise对象有三种状态分别是pending、resolved(成功)、rejected(失败),新创建的promise对象状态是pending,promise对象有一个函数参数用来作为回调函数,回调函数中执行异步的操作,当异步执行成功时promise对象状态就会从pending转变为resolved,失败则会变成rejected状态,并且他们之间只能进行一次转换,转换的关系只有以下两种,pending=>rejected,pending=>resolved;成功后便会调用then()函数,失败则调用catch()函数,这两个函数都会返回一个新的promise对象。

语法

//1.新建一个promise对象
const p = new Promise( (resolve, reject) => {
    //执行异步的操作
    //如果成功调用resolve(value)
    //失败rejecte(reason)
    setTimeout(
        resolve('hello');
    );
    
});
p.then(
    //接收成功的value数据
    value => {
        console.log(value);
    }
);

promise相比传统的回调函数特点是指定回调函数的方式更加灵活,promise启动异步任务之后返回promise对象,再给promise对象绑定回调函数,甚至可以在异步执行完成之后在指定回调函数。第二点就是支持链式调用,可以解决回调地狱问题。

举个例子

let fs = require('fs')
fs.readFile('./a.txt','utf8',function(err,data){
  fs.readFile(data,'utf8',function(err,data){
    fs.readFile(data,'utf8',function(err,data){
      console.log(data)
    })
  })
})

let fs = require('fs')
function read(url){
  return new Promise((resolve,reject)=>{
    fs.readFile(url,'utf8',function(error,data){
      error && reject(error)
      resolve(data)
    })
  })
}

read('./a.txt').then(data=>{
  return read(data) 
}).then(data=>{
  return read(data)  
}).then(data=>{
  console.log(data)
}).catch(failureCallback);

以上就是普通回调函数和使用promise对象来解决异步的区别,不难看出无论是在阅读性还是在异常处理上都比较简单方便。这就完了吗,然而这并不是最简单的方法,async和await的配合使用且听下回分解

参考
链接:https://juejin.cn/post/6844903629187448845