Node.js 异步编程

209 阅读2分钟

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();