登录  /  注册
首页 > web前端 > js教程 > 正文

深入理解NodeJs异步编程的含义

藏色散人
发布: 2022-08-08 14:38:14
转载
1547人浏览过

首先理解什么是异步编程

含义:

  • 有异步肯定会有同步

  • 凡是回调函数存在的,都是异步代码

  • 先执行同步代码,看到异步代码后,将异步代码放到异步代码执行区(先不执行)

  • 继续执行同步代码,当所有的同步代码执行结束后,在执行异步代码

异步代码案例:

console.log('1');
setTimeout(()=>{
	console.log('2秒后再执行...');
},2000);
console.log('end');
登录后复制

程序执行完毕后的输出结果:
1
恩德
2秒后再执行…

总结:代码会在执行中会依次执行,但执行到回调函数,就会把回调函数放入异步代码执行区,先不执行,如果代码执行完后,再去依次执行放入异步代码执行区。

同步代码行案例:

for(let i=0;i<p>程序执行完毕后的输出结果:<br> 0123456789<br> end<br><strong>总结:同步代码,for循环无论执行多久,下面代码都要等待它执行完毕后才会执行。</strong></p><h2>2.为什么有异步编程</h2><p>nodejs 特点是单线程、异步、非阻塞,如果代码逻辑涉及到多个回调,就会出现非常可怕的代码,不利于后期的维护。</p><p>而异步编程的作用就是提高效率,现在对程序越来越大,CPU和内存对压力也越来越大,异步可以让电脑同时处理多个事务,所以需要异步编程。</p><h2>3.如何处理异步编程出现的问题</h2><p>在我们项目当中,会出现一些问题,比如,拿不到值,是undefined,是因为异步编程。<br> 解决方案:回调函数嵌套、 Promise、 await、async语法糖 变成同步</p><p>现在文件夹里有1,2,3三个txt文件,我们需要读取这三个文件,如果直接读取第一遍可能顺序对第二遍就会出现顺序混乱的情况,所以我们需要处理异步的问题,让他按顺序执行</p><p>使用回调函数嵌套代码:</p><pre class="brush:php;toolbar:false">const fs=require('fs')
const path =require('path')
let p1=path.join('1.txt')
let p2=path.join('2.txt')
let p3=path.join('3.txt')
fs.readFile(p1,'utf8',(err,data)=&gt;{
    if(err) throw err
    console.log(data)
    fs.readFile(p2,'utf8',(err,data)=&gt;{
        if(err) throw err
        console.log(data)
        fs.readFile(p3,'utf8',(err,data)=&gt;{
            if(err) throw err
            console.log(data)
        })
    })
})
登录后复制

使用Promise代码:

// new promise 的作用:让异步代码马上执行
const fs=require('fs')
function readFile(path){
    return new Promise((resolve,reject)=&gt;{
        fs.readFile(path,'utf8',(err,data)=&gt;{
            resolve(data)
        })
    })
}
let p1=readFile('1.txt')
let p2=readFile('2.txt')
let p3=readFile('3.txt')
p1.then(result=&gt;{
    console.log(result)
    return p2
}).then(result=&gt;{
    console.log(result)
    return p3
}).then(result=&gt;{
    console.log(result)
    return p3
})
登录后复制

还可以使用 await、async语法糖 代码:

const path=require('path')
const fs=require('fs')
let p1=readFile('1.txt')
let p2=readFile('2.txt')
let p3=readFile('3.txt')
var readfile=(path)=&gt;{
    return new Promise((resolve,reject)=&gt;{
        fs.readFile(path,'utf8',(err,data)=&gt;{
            resolve(data)
        })
    })
}

async function exec() {
    await readfile(p1).then(result =&gt; console.log(result))
    await readfile(p2).then(result =&gt; console.log(result))
    await readfile(p3).then(result =&gt; console.log(result))
}
exec()
登录后复制

【推荐:node.js视频教程

以上就是深入理解NodeJs异步编程的含义的详细内容,更多请关注php中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:csdn网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号