Promise, async, await实现异步编程,代码详解

简介: Promise, async, await实现异步编程,代码详解

写在开头

一点题外话

其实最近在不断的更新Java的知识,从基础到进阶,以及计算机基础、网络、WEB、数据库、数据结构、Linux、分布式等等内容,预期写成一个既可以学习提升又可以面试找工作的《Java成长之路》!算是对自己学习的总结(笔记),也算是一种程序猿的记忆,现在大环境那么差,万一哪天转行了,还能当做一种记忆。

以往的博客都是按照知识点的顺序发的,但今天一个大一的粉丝私信问JS异步编程内容,决定先理一理这块内容,想着后面如果还是有类似的咨询,则会破坏原有发文顺序,进行交叉更新,最后,会将所有内容汇总成PDF,发给需要的朋友哈。

image.png

回到话题

ok,那我们现在就一起来学习一下JS的异步编程吧,异步的诞生是因为同步带来的诸多不便,我们都知道JavaScript是单线程时间循环模型,同步如同流水线,一步步的往下走中间有步骤失败,下面的功能就无法进行,这显然不是我们想要的。我们想要的是,一个程序在执行的过程中,我们可以去干其他的,不需要等待它的完成再往下执行,这就是异步

异步编程

什么是异步编程?刚刚的大白话已经点名,为了能更直观的感受,我们看下面这段代码:
【代码示例1】

const i = 'HelloWord';
setTimeout(() => {
   
   
    console.log('JavaBuild')
}, 2000);
console.log(i)

我们上面说了JS是单线程的,在这个主线程中,我们通过setTimeout()这个回调函数,实现了异步。控制台运行的时候我们就会发现,HelloWord先打印,等2秒后打印JavaBuild。
这种通过简单的回调函数实现异步,在复杂的代码逻辑中,多个异步操作时会带来“回调地狱”,因此同样不常用。

Promise

为了优化(注意是优化,并不是彻底解决回调地狱)多层嵌套的异步调用,Promise(承诺)应运而生。
Promise 对象表示异步操作最终的完成(或失败)以及其结果值。

一个 Promise 是一个代理,它代表一个在创建 promise 时不一定已知的值。它允许你将处理程序与异步操作的最终成功值或失败原因关联起来。这使得异步方法可以像同步方法一样返回值:异步方法不会立即返回最终值,而是返回一个 promise,以便在将来的某个时间点提供该值

通过Promise我们可以实现相同的效果
【代码示例2】

new Promise((resolveOuter) => {
   
   
    resolveOuter(
        new Promise((resolveInner) => {
   
   
            setTimeout (() => {
   
   
                console.log("resolveInner");
            }, 1000 );

        }),
    );
    console.log('resolveOuter')
});

此 Promise 在创建时已经被解决(因为 resolveOuter 是同步调用的),但它是用另一个 Promise 解决的,因此在内部 Promise 兑现的 1 秒之后才会被兑现。

Promise的链式调用

Promise.prototype.then()、Promise.prototype.catch() 和 Promise.prototype.finally() 方法用于将进一步的操作与已敲定的 Promise 相关联。由于这些方法返回 Promise,因此它们可以被链式调用。
【代码示例3】

const myPromise = new Promise((resolve, reject) => {
   
   
  setTimeout(() => {
   
   
    resolve("JavaBuild");
  }, 300);
});

myPromise
  .then(handleFulfilledA)
  .then(handleFulfilledB)
  .then(handleFulfilledC)
  .catch(handleRejectedAny);

关于Promise相关的详细内容这里不再赘述了,因为真实的使用中,我们一般也不会这样写,感兴趣的同学,可以看这篇文章一文看懂Promise

async / await

在ES8语法中带来了两个新词asyncawait,进一步的通过异步函数实现异步操作,并将Promise(期约)应用于JavaScript函数的结果。

async关键字用于声明异步函数,它可以在函数声明,函数表达式还有箭头函数上使用,使用async关键字可以让函数具有异步特征,在实际中它需要和await配合使用。
【代码示例4】

    async function msg(){
   
   }
    let jackson = async function(){
   
   }
    let jackson = async ()=>{
   
   }

一旦定义了一个函数作为一个异步函数,我们就可以使用 await 关键词。这个关键词放在回调的Promise之前,将会暂停执行函数,直到Promise执行或拒绝。
【代码示例5】

 async function msg(){
   
   
        let p = new Promise((resolve,reject)=>setTimeout(resolve,1000,'JavaBuild'));
        console.log(await p);
    }
 msg();

await关键字其实很简单,js运行在碰到await关键字时,会记录在哪里暂停执行。等到await右边的值可以使用了,就是处理完回调了,js会向消息列对中推送一个任务,这个任务会恢复异步函数的执行。这样的话,即使await后面跟着一个立即可用的值,函数的其余部分也会被异步求值。

【代码示例6】

    async function fun01(){
   
   
        console.log(await Promise.resolve('第一名'));
    }
    async function fun02(){
   
   
        console.log(await '第二名');
    }
    async function fun03(){
   
   
        console.log('第三名');
    }
    fun01();
    fun02();
    fun03();

大家猜一猜最终打印出来的结果顺序是啥?

//因为await原因,fun01,fun02进入暂停队列,fun03先执行,返回已解决(已敲定)的Promise后,进入fun01,执行返回后,在进入fun02。
第三名
第一名
第二名

ok,以上就是简单的JS异步编程啦!

结尾彩蛋

如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏呀。原创不易,转载请联系Build哥!

image.png

目录
相关文章
|
1月前
|
JSON 前端开发 JavaScript
【JavaScript技术专栏】JavaScript异步编程:Promise、async/await解析
【4月更文挑战第30天】JavaScript中的异步编程通过Promise和async/await来解决回调地狱问题。Promise代表可能完成或拒绝的异步操作,有pending、fulfilled和rejected三种状态。它支持链式调用和Promise.all()、Promise.race()等方法。async/await是ES8引入的语法糖,允许异步代码以同步风格编写,提高可读性和可维护性。两者结合使用能更高效地处理非阻塞操作。
|
1天前
|
前端开发 JavaScript 开发者
JavaScript中的异步编程:Promise与Async/Await
在现代前端开发中,JavaScript的异步编程变得越来越重要。本文将深入探讨JavaScript中的两种常见异步编程方式:Promise和Async/Await,并比较它们之间的优劣势,帮助读者更好地理解和运用这些技术。
|
5天前
|
JSON 前端开发 JavaScript
ES6引入Promise和async/await解决异步问题
【6月更文挑战第12天】ES6引入Promise和async/await解决异步问题。Promise处理异步操作,有pending、fulfilled、rejected三种状态,支持链式调用和并行处理。async/await是基于Promise的语法糖,使异步代码更同步化,提高可读性。两者都是处理回调地狱的有效工具,开发者应根据需求选择合适的方式。
23 3
|
17天前
|
前端开发
Promise 和 Async/await 在实际开发中的应用场景
Promise 和 Async/await 在实际开发中的应用场景
|
1月前
|
前端开发
Promise和async/await之间有什么区别
Promise与async/await是异步编程的两种模式。Promise使用.then()和.catch()处理回调,语法较复杂,易出现回调地狱;而async/await提供更清晰的顺序代码,使用try/catch进行错误处理,使异步操作更易读、易维护。Promise在控制流和错误堆栈方面较为灵活,但定位错误难,而async/await自动等待、线性控制流,错误堆栈清晰。两者各有优势,选择取决于具体需求和偏好。
|
1月前
|
前端开发 Go
Golang深入浅出之-Go语言中的异步编程与Future/Promise模式
【5月更文挑战第3天】Go语言通过goroutines和channels实现异步编程,虽无内置Future/Promise,但可借助其特性模拟。本文探讨了如何使用channel实现Future模式,提供了异步获取URL内容长度的示例,并警示了Channel泄漏、错误处理和并发控制等常见问题。为避免这些问题,建议显式关闭channel、使用context.Context、并发控制机制及有效传播错误。理解并应用这些技巧能提升Go语言异步编程的效率和健壮性。
46 5
Golang深入浅出之-Go语言中的异步编程与Future/Promise模式
|
1月前
|
前端开发 JavaScript
如何处理 JavaScript 中的异步操作和 Promise?
如何处理 JavaScript 中的异步操作和 Promise?
20 1
|
1月前
|
前端开发 JavaScript
在JavaScript中,什么是promise、怎么使用promise、怎么手写promise
在JavaScript中,什么是promise、怎么使用promise、怎么手写promise
33 4
|
1月前
|
前端开发 JavaScript 开发者
JavaScript 中的异步编程:Promise 和 Async/Await
在现代的 JavaScript 开发中,异步编程是至关重要的。本文将介绍 JavaScript 中的异步编程概念,重点讨论 Promise 和 Async/Await 这两种常见的处理异步操作的方法。通过本文的阐述,读者将能够更好地理解和应用这些技术,提高自己在 JavaScript 开发中处理异步任务的能力。
|
1月前
|
前端开发 JavaScript
在JavaScript中,回调函数、Promise和async/await这三种异步处理机制的优缺点
JavaScript的异步处理包括回调函数、Promise和async/await。回调函数简单易懂,但可能导致回调地狱和错误处理困难。Promise通过链式调用改善了这一情况,但仍有回调函数需求和学习成本。async/await提供同步风格代码,增强可读性和错误处理,但需ES8支持,不适用于并发执行。根据项目需求选择合适机制。