node.js 异步 编程简化简化再简化

46 篇文章 1 订阅
12 篇文章 0 订阅

node.js异步编程

同步API

console.log(' before ');
setTimeout(function () {
    console.log("last");
}, 2000)
console.log('after');
/*  before 
after
last */

异步API

function getMsg() {
    setTimeout(function () {
        return {
            msg: 'hello node.js'
        }
    }, 2000)
}
const msg = getMsg();
console.log(msg); //undefined

获取异步API的返回值

可以通过回调函数来

function getData(callback) {
    callback('123')
}

getData(function (n) {
    console.log(' callback函数被调用了') // callback函数被调用了
    console.log(n) //123
})

进一步简化

function getMsg(callback) {
    setTimeout(function () {
        callback({
            msg: 'hello node.js'
        })
    }, 2000)
}
const msg = getMsg(function (data) {
    console.log(data) //{ msg: 'hello node.js' }
});

同步API 和 异步API 执行顺序的区别

同步API
console.log('代码开始执行')
setTimeout(function () {
    console.log(' 2s ')
}, 2000)
setTimeout(function () {
    console.log('Os ')
}, 0)
console.log('代码结束执行')
/* 
代码开始执行
代码结束执行
Os 
2s  
*/
异步API
const fs = require('fs');
let promise = new Promise((resolve, reject) => {
    fs.readFile('./Node.js/async/14.txt', 'utf8', (err, result) => {
        if (err != null) {
            reject(err);
        } else {
            resolve(result);
        }
    });
});
promise.then((result) => {
    console.log(result)
}).catch(err => {
    console.log(err);
})

利用回调方式规定执行顺序

const fs = require('fs');
// 回调地狱
// fs.readFile('./Node.js/async/1.txt', 'utf8', (err, result1) => {
//     console.log(result1)
//     fs.readFile('./Node.js/async/2.txt', 'utf8', (err, result2) => {
//         console.log(result2)
//         fs.readFile('./Node.js/async/3.txt', 'utf8', (err, result3) => {
//             console.log(result3)
//         })
//     })
// });

function p1() {
    return new Promise((resolve, reject) => {
        fs.readFile('./Node.js/async/1.txt', 'utf8', (err, result) => {
            resolve(result)
        })
    });
}

function p2() {
    return new Promise((resolve, reject) => {
        fs.readFile('./Node.js/async/2.txt', 'utf8', (err, result) => {
            resolve(result)
        })
    });
}

function p3() {
    return new Promise((resolve, reject) => {
        fs.readFile('./Node.js/async/3.txt', 'utf8', (err, result) => {
            resolve(result)
        })
    });
}
// p1().then((r1) => {
//     console.log(r1);
// })
p1().then((r1) => {
        console.log(r1);
        return p2();
    })
    .then((r2) => {
        console.log(r2);
        return p3();
    })
    .then((r3) => {
        console.log(r3)
    })

利用await promise 关键字进一步简化代码

//1.在普通函数定义的前面加上async关键字普通函数就变成了异步函数
//2.异步函数默认的返回值是promise对象
//3.在异步函数内部使用throw关键字进行错误的抛出//
//await关键字
// 1.它只能出现在异步函数中
// 2.await promise 
// 它可以暂停异步函数的执行等待promise对象返回结果后再向下执行函数
 async function fn() {
    // throw '发生了一些错误';
    return 123;
    //console.log(fn()){
}
fn().then(function (data) {
    console.log(data);
}).catch(function (err) {
    console.log(err);
}) 

利用async await 关键字 实现更简

async function p1() {
    return 1;
}
async function p2() {
    return 2;
}
async function p3() {
    return 3;
}
async function run() {
    let r1 = await p1();
    let r2 = await p2();
    let r3 = await p3();
    console.log(r1, r2, r3);
}
run();

今日激励

我相信,无论今后的道路多么坎坷,只要抓住今天,迟早会在奋斗中尝到人生的甘甜。抓住人生中的一分一秒,胜过虚度中的一月一年!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bliss小宝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值