异步回调 async promise
1.目的:解决地狱回调、异步调用方法
2.原理:
进程、线程、协程原理:
Generator很多语言中都有,本质上是协程,下面就来看一下协程,线程,进程的区别与联系:
-
进程:操作系统中分配资源的基本单位
-
线程:操作系统中调度资源的基本单位
-
协程:比线程更小的的执行单元,自带cpu上下文,一个协程一个栈
一个进程中可能存在多个线程,一个线程中可能存在多个协程,进程、线程的切换由操作系统控制,而协程的切换由程序员自身控制。异步i/o利用回调的方式来应对i/o密集,同样的使用协程也可以来应对,协程的切换并没有很大的资源浪费,将一个i/o操作写成一个协程,这样进行i/o时可以吧cpu让给其他协程。
js同样支持协程,那就是yield。使用yield给我们直观的感受就是,执行到了这个地方停了下来,其他的代码继续跑,到你想让他继续执行了,他就是会继续执行。
3.使用:
抛开旧的方法 使用 promise 和async 的方法是目前最优解决方案
<script type="text/html" style="display:block">const readFile = file =>
new Promise((reslove, reject) => {
fs.readFile(file, (err, data) => {
if (err) reject(err);
reslove(data);
});
});
const readTwoFile = async function() {
const f1 = await readFile('./a.txt');
const f2 = await readFile('./b.txt');
return Buffer.concat([f1, f2]).toString();
};
readTwoFile().then(data => {
console.log(data);
});</script>
async/await做的就是将Promise对象给串联起来,避免了then的调用方式,代码非常的易读,就是一种同步的方式。不再需要借助其他外界类库(比如co库)就可以优雅的解决回调的问题

浙公网安备 33010602011771号