1, 同步API sync
当前API执行完成后,才能继续执行下一个API
2, 异步API async
当前API的执行不会阻塞后续代码的执行
3, 同步API可以从返回值中拿到API的执行结果,但异步API是不可以的
function getMsg(){
setTimeout(function(){
return 'hello node.js';
},2000)
}
const msg = getMsg();
console.log(msg); // undefined
// 运行 setTimeout(耗时操作)时,不会阻塞后面代码 (console.log(msg) ),
4, callback 回调函数
function getMsg(callback){
setTimeout(function(){
callback({
msg:'hello node.js'
} )
},2000)
}
getMsg(function(data){
console.log(data);
});
5, 代码执行顺序
虽然有个 0 秒的计时器,但是也是异步API,将被放到异步代码执行区,等待同步代码执行区的代码执行完了才执行。
6, 回调地狱, callbackhell
当存在多个异步任务时,我们想要按一定顺序完成,那么我们可以在一个异步API的回调函数中编写另一个异步API,当嵌套过多时,就变成难以维护的 回调地狱
Promise : 解决Node.js 异步编程中回调地狱的问题
==========================================================
1, 异步函数
异步函数是异步编程语法的终极解决方案,它可以让我们将异步代码写成同步的形式,让代码不再有回调函数嵌套。
-
async 普通函数定义前加 async 关键字, 普通函数变成异步函数
-
异步函数默认返回promise对象
-
在异步函数中使用return 进行结果返回,结果会包裹在promise对象中,return 关键字代替的是 resolve 方法
-
在异步函数内部使用 throw 抛出异常,throw 后面的代码不会继续执行
-
调用异步函数再链式调用then方法获取异步函数的执行结果
-
调用catch方法 获取错误信息
-
await 关键字只能出现在 异步函数中
-
await 后面只能写promis对象
-
awiat 可以暂停异步函数向下执行,直到promise返回结果
const fs = require('fs');
// promisify 可以改造 异步API ,使其返回 promise 对象 const promisify = require('util').promisify; const readFile = promisify(fs.readFile);
async function run(){ let r1 = await readFile('./1.txt','utf8'); let r2 = await readFile('./2.txt','utf8'); let r3 = await readFile('./3.txt','utf8'); console.log(r1, r2, r3 ); }
run();