3.node.js异步编程(promise)

(一)同步API,异步API

[1]. 回调函数

function getData (callback){}
getData(()=>{})

[2]. 用回调函数获取异步函数中的值

function fun(callback){
    setTimeout(()=>{
        const val = 'hello world';
        callback(val)
    },2000)
}

fun((value)=>{
   console.log(value);
})

[3].代码执行顺序

  • 同步代码,会被放到同步代码执行区中,异步代码会被放到异步代码执行区中,将异步代码中的回调函数,放入到回调函数队列
  • 当同步代码执行区中的代码执行完毕后,执行异步代码执行去中的代码,当异步代码执行区的某行代码被执行时,会将该代码对应的在回调函数队列中的回调函数放入同步代码执行区
  • 同步代码执行区的代码开始执行
    在这里插入图片描述
    function f1(){
    	//异步代码
        setTimeout(()=>{
        //异步代码中的回调韩束
            console.log('2秒后执行');
        },2000)
    }
    function f2(){
        setTimeout(()=>{
            console.log('0秒后执行');
        },0)
    }
    function f3(){
        console.log('同步执行');
    }
    f1();
    f2();
    f3();
    //结果:同步执行》0秒后执行》2秒后执行
    

(二) Node.js中的异步API

[1]. Promise

Promise出现的目的是解决Node.js异步编程中回调地狱的问题。

在读取1.txt完成后读取2.txt,读取完成后读取3.txt

const fs = require('fs');

function fRead1() {
    return new Promise((resolve, reject) => {
        fs.readFile('./1.txt', 'utf8', (err, result) => {
            if (err) {
                reject(err);
            } else {
                resolve(result);
            }
        })
    });
}
function fRead2() {
    return new Promise((resolve, reject) => {
        fs.readFile('./2.txt', 'utf8', (err, result) => {
            if (err) {
                reject(err);
            } else {
                resolve(result);
            }
        })
    });
}
function fRead3() {
    return new Promise((resolve, reject) => {
        fs.readFile('./3.txt', 'utf8', (err, result) => {
            if (err) {
                reject(err);
            } else {
                resolve(result);
            }
        })
    });
}
fRead1().then((result) => {
    console.log(result);
    return fRead2();
}).then((result) => {
    console.log(result);
    return fRead3();
}).then((result) => {
    console.log(result);
})

[2]. async和await (ES7)

1). async关键字

  1. 在普通函数定义的前面加上async关键字,普通函数就变成了异步函数。
  2. 异步函数默认的返回值就是promise对象。
  3. 在异步函数内部使用return关键字进行结果返回 结果会被包裹的promise对象中 return关键字代替了resolve方法
  4. 异步函数内部使用throw关键字进行错误的抛出。
  5. 调用异步函数再链式调用then方法获取异步函数执行结果
  6. 调用异步函数再链式调用catch方法获取异步函数执行的错误信息

2). await关键字

  1. 它只能出现在异步函数中
  2. await后面只能写promise对象 写其他类型的API是不可以的
  3. await关键字可是暂停异步函数向下执行 直到promise返回结果

3). 读取文件

const fs = require('fs');
//改造现有异步函数api 让其返回promise对象,从而支持异步函数语法
const promisify = require('util').promisify;
//调用promisify方法改造现有异步API,让其返回promise对象
const readFile = promisify(fs.readFile);
console.log('%s',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);
    console.log(r2);
    console.log(r3);
}
run()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值