第二十五章 异步处理-Promise的使用

一、异步

1. 什么是异步

  • 异步(Asynchronous, async)是与同步(Synchronous, sync)相对的概念。
  • 在我们学习的传统单线程编程中,程序的运行是同步的(同步不意味着所有步骤同时运行,而是指步骤在一个控制流序列中按顺序执行)。
  • 而异步的概念则是不保证同步的概念,也就是说,一个异步过程的执行将不再与原有的序列有顺序关系。
  • 简单来理解就是:同步按你的代码顺序执行,异步不按照代码顺序执行,异步的执行效率更高。

2. js中有哪些异步程序

  1. 客户端
    • 计时器
    • ajax
  2. 服务端(Node.js)
    • fs文件操作
    • 数据库操作
setTimeout(function(){
  console.log("异步程序1");
}, Math.round(Math.random()*1000));

setTimeout(function(){
  console.log("异步程序2");
}, Math.round(Math.random()*1000));

setTimeout(function(){
  console.log("异步程序3");
}, Math.round(Math.random()*1000));

3. 异步程序带来的问题

  • 异步程序虽然可以极大的提升程序的执行效率,但也带来了一些不可避免的问题。最常见的就是无法保证程序的执行顺序,导致无法在同步状态下获取异步程序数据等

二、Promise用来解决什么问题

1. 什么是回调地狱

  • 回调函数嵌套调用,根据外层异步程序执行结果,调用内层异步程序
setTimeout(function(){
  console.log("异步程序1");

  setTimeout(function(){
    console.log("异步请求2");

    setTimeout(function(){
      console.log("异步请求3");
    }, Math.round(Math.random()*1000));

  }, Math.round(Math.random()*1000));

}, Math.round(Math.random()*1000));
  • 回调地狱的缺点:代码可读性低,不利于查错,异常处理机制较差,浪费性能

2. 使用Promise优化回调地狱

  1. Promise的简单说明
  2. 使用Promise优化回调地狱
    • Promise的链式调用可以很好的解决回调地狱问题
asyncFunc1().then(response => {
  return asyncFunc2();
}).then(response => {
  return asyncFunc3();
}).then(response => {
  // 所有异步完成后的其他操作
})
  1. 使用Promise之后的优势
    • 方便阅读
    • 查错方便
    • 状态管理

三、Promise的使用

1. Promise的基本状态

  1. 三种状态的含义和特点
    1. pending:正在进行时…
    2. fulfilled:完成
    3. rejected:失败

2. Promise的基本语法

创建Promise实例,立即传入回调函数

new Promise((resolve, reject)=>{
  console.log("正在进行时");
  resolve("已完成")
  reject("已失败")
})

3. Promise实例的方法

  1. promise.then()
    • promise实例状态为成功时执行
    • 参数:回调函数;回调1用来处理成功状态,回调2用来处理失败状态,回调2可选
    • 返回值:当前promise实例状态对应的回调函数的返回值,这个返回值必然是一个新的Promise实例,哪怕主动返回的不是Promise实例,也会被处理成Promise实例
  2. promise.catch()
    • promise实例状态为失败时执行
    • 参数:回调函数,用来处理失败状态
    • 返回值:回调函数的返回值
  3. promise.finally()
    • promise实例状态为成功或失败时都会执行,表示当前promise结束了
    • 参数:回调函数,用来处理结束后的状态
    • 返回值:回调函数的返回值

4. 使用Promise实例的方法优化回调地狱问题

  1. 场景描述
  2. 解决方式:链式回调
  3. 总结

5. Promise类的方法

  1. Promise.resolve()
    • 返回一个成功状态的Promise实例
    • 参数:成功状态下的数据
  2. Promise.reject()
    • 返回一个失败状态的Promise实例
    • 参数:失败状态下的数据
  3. Promise.all()
    • 用于将多个 Promise 实例,包装成一个新的 Promise 实例。
    • Promise.all()全部子实例都成功才算成功,只要有一个子实例失败就算失败。
    • 参数:多个Promise实例的数组
  4. Promise.any()
    • 用于将多个 Promise 实例,包装成一个新的 Promise 实例。
    • Promise.any()只要有一个子实例成功就算成功,所有子实例失败才算失败。
    • 参数:多个Promise实例的数组
  5. Promise.race()
    • 用于将多个 Promise 实例,包装成一个新的 Promise 实例。
    • Promise.race()赛跑机制,取决于最先执行结束的子实例的状态
    • 参数:多个Promise实例的数组
  6. Promise.allSettled()
    • 用于将多个 Promise 实例,包装成一个新的 Promise 实例。
    • Promise.allSettled()所有子实例结束,新实例才会完成,包含所有子实例的状态
    • 参数:多个Promise实例的数组

四、异步的终极解决方案:Async / Await

  1. async关键字,在函数的function关键字之前使用,用于表示当前函数是一个异步函数,且函数执行结果自动返回一个成功状态的Promise实例,这个异步函数内的return关键字用于给这个成功状态的Promise实例返回成功时的数据。
async function fn1(){}

console.log(fn1());		// Promise {<fulfilled>: undefined}

async function fn2(){
    return "hello";
}

console.log(fn2());		// Promise {<fulfilled>: 'hello'}

fn2().then(res=>{
    console.log(res);		// hello
})
  1. await关键字只能在async声明的异步函数中使用,表示等待。等待一个异步执行结束并返回成功状态时的数据。await可以将异步的函数同步执行,await一般用于等待Promise的状态
async function fn(){
    const res = await test();
    console.log(res);		// success
}

function test(){
    return new Promise((resolve, reject)=>{
        setTimeout(function(){
            resolve("success");
        },Math.random()*1000)
      
        setTimeout(function(){
            reject("error");
        },Math.random()*2000)
    })
}
  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
异步数据处理是指在处理数据时,使用Promise处理异步操作。Promise是一种异步编程的解决方案,它是一个容器,可以保存某个未来才会结束的事件(通常是一个异步操作)的结果。通过Promise,我们可以获取异步操作的消息,并使用统一的API来处理各种异步操作。Promise的设计思想是为了让我们摆脱回调地狱的困扰,使代码更加清晰和易于维护。 在使用Promise时,我们可以创建一个Promise实例,并在其构造函数中定义异步操作。通过resolve函数来表示异步操作成功,并传递相应的结果,而通过reject函数来表示异步操作失败,并传递相应的错误信息。例如: ```javascript const promise = new Promise(function(resolve, reject) { // 异步操作 if (/* 异步操作成功 */) { resolve(value); // 成功时调用resolve,并传递结果 } else { reject(error); // 失败时调用reject,并传递错误信息 } }); ``` 通过使用Promise,我们可以使用then方法来处理异步操作的结果,catch方法来捕获异步操作的错误。同时,我们还可以使用Promise的链式调用来处理多个异步操作的依赖关系,以及使用Promise.all或Promise.race来处理多个异步操作的并发或竞争关系。 总之,异步数据处理中的Promise提供了一种简洁、可靠的方式来处理异步操作,使我们的代码更加可读、可维护,并提供了更好的错误处理机制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨树林er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值