深度解析Promise解决回调函数的原理

本文介绍了Promise作为解决回调地狱的一种方法,通过示例详细解释了Promise的三种状态及其工作原理。Promise的.then和.catch实现异步操作的链式调用,确保异步函数按顺序执行。通过封装和链式写法展示了如何优雅地处理异步代码,避免回调地狱。
摘要由CSDN通过智能技术生成

接上篇文章:回调函数的嵌套可以让异步代码同步化,但是会造成回调地狱,如何解决。

  Promise:

         它是书写异步代码的另一种方式,可以解决回调地狱的嵌套问题。

         它的状态有三个:pending(等待中)、fulfilled(也叫resolved,成功)、rejected(失败),怎么理解这三种状态呢,这里举个例子:

小明:排位吗,带我一个
小亮:你太坑了,老是不参团
小明:相信我,我的战术已经改进了,这把带你们躺赢

一局下来:……

分析:小明说,这次带队友躺赢,是许下了承诺,这一局的过程是在等待结果。其中结果无非就两种,一是继续坑队友,导致失败,二是真的兑现承诺,带队友躺赢。

promise也是这样,允下个承诺,结果有可能是失败,也有可能是成功,这都是将来要发生的事情,也就是代码中的异步函数,一定时间后才会有结果,所以说promise是书写异步代码的一种方式。

promise基本语法:

1.创建promise对象

2.使用promise对象

const fs = require('fs')
// 创建promise对象
const p = new Promise(function(resolve,reject) {
//a.txt是要读取的本地文件,这个是node.js里面的fs模块读取文件的方法
  fs.readFile('a.txt','utf8',(err,data)=>{
    if(err) {
      reject(err)
    }else{
      resolve(data)
    }
  })
})
// 使用promise对象 .then  .catch
p.then(res =>{
  console.log(res);
}).catch(err =>{
  console.log(err);
})

其中,resolve和reject是promise内部提供的函数,resolve是成功的时候需要调用的函数reject是失败的时候需要调用的函数。(重点)

promise中的.then和.catch的执行原理 ---  promise状态的改变。

一旦创建promise实例对象,此时promise的状态就是pending,万物伊始,一切都是新的

当承诺兑现,promise的状态由pending改为resolved,使用promise的时候,就会自动进入.then的方法中,捕获到成功的数据

当承诺兑现失败,promise的状态由pending改为rejected,使用promise的时候,就会自动进入.catch的方法中,返回失败的结果。

而且使用promise对象的时候,.then下面不仅可以链接.catch,也可以链接下一个.then,执行下一个异步函数,形成链式结构,将异步函数同步进行,只有获得上一个结果之后才进行下一步操作,注意:一个异步代码出错,下面的都不执行,直接跳到.catch里抛出错误。

promise的封装及链式写法:

const fs = require('fs')

function pro(filePath){
  return  new Promise(function(resolve,reject) {
    fs.readFile(filePath,'utf8',(err,data)=>{
      if(err) {
        reject(err)
      }else{
        resolve(data)
      }
    })
  })
}
pro('a.txt').then(res=>{
  console.log(res);
  return pro('b.txt')
}).then(res=>{
  console.log(res);
  return pro('c.txt')
}).then(res=>{
  console.log(res);
  return pro('d.txt')
}).then(res=>{
  console.log(res);
}).catch(err =>{
  console.log(err);
})
// 一个出错,下面都不执行,直接进入catch
//打印顺序:a.txt --> b.txt  --> c.txt -->d.txt

函数调用,return出去的是一个新的promise对象,作为下次执行时的决定promise状态的主角.

码字不易,如果觉得不错的话,点个赞再走呗

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值