首页IT科技async和await的区别(async和await的实现原理)

async和await的区别(async和await的实现原理)

时间2025-09-17 23:05:16分类IT科技浏览5395
导读:由于javascript是单线程的执行模型,因此为了提高效率就有了异步编程,单线程在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行。 但是我们也需要类似多线程机制的这种执行方式,我们需要异步执行编程,异步执行编程会使得多个任务并发执行。 异步编程可以实现多任务并发执行,指同一时刻内多任务同时进行,边...

由于javascript是单线程的执行模型                ,因此为了提高效率就有了异步编程                      ,单线程在程序执行时        ,所走的程序路径按照连续顺序排下来            ,前面的必须处理好                      ,后面的才会执行                。 但是我们也需要类似多线程机制的这种执行方式           ,我们需要异步执行编程        ,异步执行编程会使得多个任务并发执行                      。 异步编程可以实现多任务并发执行                       ,指同一时刻内多任务同时进行              ,边煮饭    ,边烧水                        ,可以同时进行                  ,进而提高效率        。

1.回调函数

回调函数,就是把任务的第二段单独写在一个函数里面                    ,等到重新执行这个任务的时候                      ,就直接调用这个函数            。

回调函数最大的问题是容易形成回调地狱    ,即多个回调函数嵌套                ,降低代码可读性                      ,增加逻辑的复杂性        ,容易出错                      。

fs.readFile(file1, function (err, data) { fs.readFile(file2, function (err, data) { // }) })

2.promise

为解决回调函数的不足            ,就有了Promise           。

const fs = require(fs) const readFileWithPromise = file => { return new Promise((resolve, reject) => { fs.readFile(file, (err, data) => { if (err) { reject(err) } else { resolve(data) } }) }) } readFileWithPromise(/etc/passwd) .then(data => { console.log(data.toString()) return readFileWithPromise(/etc/profile) }) .then(data => { console.log(data.toString()) }) .catch(err => { console.log(err) })

promise 实际上是利用编程技巧将回调函数的横向加载                      ,改成纵向加载           ,达到链式调用的效果        ,避免回调地狱        。最大问题是代码冗余                       ,原来的任务被 promise 包装了一下              ,优点是减少代码嵌套    ,代码逻辑清晰                       。

3.async              、await

为了解决 promise 的问题                        ,async                        、await 在 ES7 中被提了出来

const fs = require(fs) async function readFile() { try { var f1 = await readFileWithPromise(/etc/passwd) console.log(f1.toString()) var f2 = await readFileWithPromise(/etc/profile) console.log(f2.toString()) } catch (err) { console.log(err) } }

特点:

1.异步async函数的调用                  ,跟普通的函数使用方式一样;

2.async的用法,它作为一个关键字放到函数前面                    ,这样普通函数就变成了异步函数;

3.异步async函数返回一个promise对象;

4.async函数配合await使用可以阻塞代码往下执行                      ,是异步方法              。

优点:

1.多个参数传递:promise使用then函数只能传递一个参数    ,虽然可以通过包装成对象来传递多个参数                ,但是会导致传递冗余信息                      ,频繁的解析又重新组合比较麻烦;而利用async和await可以没有这个限制        ,可以当做普通变量的局部变量来处理            ,也没有冗余工作;

2.同步和异步一起编写:使用promise的时候最好将同步代码和异步代码放在不同的then节点中                      ,这样结构更加清晰;async和await整个书写习惯都是同步的           ,不需要纠结同步和异步的区别        ,当然                       ,异步过程需要包装成一个promise对象放在await关键字后面;

3. 对promise的优化:async和await是基于promise的              ,是进一步的一种优化    。

使用场景:

async和await主要用来处理异步的操作    ,执行第一步                        ,将执行第一步的结果返回给第二步使用                  ,在ajax中先拿到一个接口的返回数据,后使用第一部返回的数据执行第二步操作的接口调用                    ,达到异步操作                        。

声明:本站所有文章                      ,如无特殊说明或标注    ,均为本站原创发布                  。任何个人或组织                ,在未征得本站同意时                      ,禁止复制        、盗用          、采集                       、发布本站内容到任何网站            、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益        ,可联系我们进行处理                    。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
如何将dos格式的文件转换成unix(dos2unix命令 – 将DOS格式的文本文件转换成UNIX格式) python数字排列组合(python中如何使用np.concatenate()拼接numpy数组)