当前位置:网站首页>简单理解ES6的Promise

简单理解ES6的Promise

2022-07-06 09:21:00 玲小叮当

简单理解ES6的Promise



前言

  1. Promise是异步编程的一种解决方案:从语法上讲,promise是一个对象,从它可以获取异步操作的消息;从本意上讲,它是承诺,承诺它过一段时间就会给你一个结果

  2. Promise可以保证异步请求变得有顺序执行

  3. 概念:PromiseES6中的新语法,本身是一个构造函数;每个new出来的Promise实例对象,都代表一个异步操作

  4. 作用: 解决了回调地狱问题(即异步嵌套调用问题)
    回调地狱:指的是回调函数中,嵌套回调函数的代码形式;如果嵌套的层级很深,就是回调地狱;
    回调地狱不利于代码的阅读、维护和后期的扩展


Promise怎么用

  1. 创建具体的异步操作对象
const p = new Promise(function(successCb, errorCb){
    
	// 在这个 function 中定义具体的异步操作
	// successCb成功回调
    // errorCb失败回调
})
  1. Promise是构造函数,可以new一个对象,本身就是一个异步操作
  2. Promisethen方法
    Promise使用时有两个方法参数successCberrorCb分别代表执行成功或失败
    Promise对象可以通过then方法对successCberrorCb进行调用

具体有两种情形如下:

result.then(function(data){
    /*成功回调*/},function(data){
    /*失败回调*/})
result.then(function(){
    /*成功回调*/}).catch(function(data){
    /*失败回调*/})

前者在then方法中通过两个参数分别接受successCberrorCb回调函数
后者通过thencatch两个方法依次接受successCberrorCb回调函数

  1. 例:
// 引入fs模块
const fs = require('fs')

// 4) Promise介入并丰富操作(加入成功 、失败回调)
function getFileCont(filename) {
    
  // 实例化Promise对象,用以表示是异步操作
  // new Promise(function(successCb函数, errorCb函数){})
  // successCb:当前异步操作是ok情况下就触发执行resolve
  // errorCb:当前异步操作发生错误情况(出乎意料)下就触发执行reject
  return new Promise(function(successCb, errorCb) {
    
    // 体现异步过程
    fs.readFile(filename, 'utf8', function(err, data) {
    
      if (err) {
    
        return errorCb('文件读取发生错误了:' + err)
      }
      // 所有操作都ok情况下的正常处理,把处理后的结果给予resolve调用(返回)
      successCb(data)
    })
  })
}
// 以下可以保证 按照顺序 获得结果
getFileCont('./files/1.txt').then(function(result) {
    
  console.log(result)
  return getFileCont('./files/2.txt')
}).then(function(result){
    
  console.log(result)
  return getFileCont('./files/3.txt')
}).then(function(result){
    
  console.log(result)
}).catch(function(err){
    
  console.log(err)
})

ES7的async和await

  1. ES7中的asyncawait可以简化Promise调用,提高Promise代码的阅读性和理解性
  2. asyncawait结合起来,可以使得异步调用不返回Promise,而直接把then参数方法的参数(也是successCb函数实参)给返回出来,使得代码更节俭,提高代码开发效率,也可以保证异步调用的顺序执行
  3. asyncawait各种使用情形:

注意:
asyncawait必须同时出现
一个async可以对应多个await
await修饰的结果必须是Promise对象

var obj = {
    
  async getInfo(){
    
    await getXXXX()
    await getXXXX()
  }
}function ffff(){
    
    // async需要设置到Promise对象的最近外层function的前边
  getInfo(async function(){
    
 		await getXXXX()
      	//console.log(getXXXX())
  })
}async function XXXX(){
    
  await getXXXX()
}

总结

  1. new Promise()实例化对象,参数回调函数会存在两个回调successCberrorCb参数
  2. 这两个回调可以通过thencatch()进行接收,但是异步调用代码多少还有地狱回调的程度体现
  3. asyncawait结合,把返回的Promise直接转变为successCb的实参,大大简化了代码开发复杂度,提升开发效率
  4. 如果有需要,通过try/catch捕捉asyncawait
  5. 通常使用,asyncawait异常三种技术结合提供的异步顺序执行的解决方案
async function getThreeFile(){
    
  try{
    
    console.log(await getFileCont('./files/1.txt')) 
    console.log(await getFileCont('./files/2.txt')) 
    console.log(await getFileCont('./files/3.txt')) 
  }catch(err){
    
    console.log(err)
  }
}
getThreeFile()
原网站

版权声明
本文为[玲小叮当]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_48963720/article/details/124840458