Node.js异步编程

// 同步api
console.log('before');
console.log('after');

打开终端

执行 node.js 01api.js 按下Tab键,回车

结果是

添加定时器

// 同步api
console.log('before');
//添加定时器测试代码执行顺序
setTimeout(()=>{console.log('last');},2000);
console.log('after');


// 同步API
function sum(a,b){
    return a+b;
}
const result = sum(10,20);
console.log(result);    //30

//异步

function getMsg() {
    setTimeout(()=>{
        return{
            msg:'hello,槿花荣'
        }
    },2000)
}

const msg = getMsg()
console.log(msg);   //undefined

运行效果:

03.

// 在异步API中无法用返回值拿到结果,但是可以通过回调函数获取值
function getData(callback) {
    callback('123');  //callback在这里是个回调函数
}

getData((n)=>{
//当callback回调函数里面包含参数,在getData函数调用里面
//匿名函数要放入一个形参接受回调函数的值
    console.log('callback函数被调用了');
    console.log(n);
})

04.

//同步API的执行顺序:从上至下依次执行,前面的代码会阻塞后面的代码的执行
for(var i=0;i<=100;i++){
    console.log(i);
}
console.log('for循环后面的语句');



05.

console.log('start');
setTimeout(()=>{console.log('2s');},2000);
setTimeout(()=>{console.log('0s');},0);
console.log('end');

 回调地狱问题

 此处是06callbackhell.js文件

另外里面的a.txt  b.txt   c.txt 文件但是要自己准备的

//依次计取A文件B文件C文件
const fs = require('fs')
fs.readFile('./a.txt','utf8',(err,result1)=>{
    console.log(result1);
    fs.readFile('./b.txt','utf8',(err,result2)=>{
        console.log(result2);
        fs.readFile('./c.txt','utf8',(err,result3)=>{
            console.log(result3);
        })
    })
})



运行效果图如下:

 使用promise解决

07.promise.js文件代码如下:

// 利用promise解决回调地狱的问题
// const  rejects  = require('assert');
const fs = require('fs')
//resolve,rejects都是函数参数
// resolve(value)可以将promise对象的状态设置为fulfilled,并将value作为失败的原因传递给后续的catch方法
// rejects(reason)可以将promise对象的状态设置为rejected,并将reason作为失败的原因传递给后续的then方法
function p1(){
    return  new Promise((resolve,rejects)=>{
        fs.readFile('./a.txt','utf8',(err,result)=>{
            resolve(result);
        });
    });
}

function p2(){
    return   new Promise((resolve,rejects)=>{
        fs.readFile('./b.txt','utf8',(err,result)=>{
            resolve(result);
        });
    });
}

function p3(){
    return new Promise((resolve,rejects)=>{
        fs.readFile('./c.txt','utf8',(err,result)=>{
            resolve(result);
        });
    });
}

p1().then((r1)=>{
    console.log(r1);
    return p2();    //只用p2()返回一个Promise对象,会在下一个then()中拿到promise对象的结果
}).then((r2)=>{
    console.log(r2);
    return p3();
}).then((r3)=>{
    console.log(r3);
    console.log('end');
})

 


 

语法知识点升级async关键字

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

08promise.js文件代码如下: 

// 1.普通函数定义前加async关键字,普通函数变成异步函数
// 2.异步函数默认返回promise对象
// 3.在异步函数内部使用return关键字进行结果返回,结果会被 包裹的promise对象中return关键字代替了resolve方法
// 4.在异步函数内部使用throw关键字抛出程序异常
// 5.调用异步函数再链式调用then方法获取异步函数执行结果

async function fn(){
    throw '发生了一个很小的错误,导致后面的代码不再执行了'  //throw代替了reject()方法
    return 123;     //return代替了resolve()方法
}
// console.log(fn());
fn().then(data =>{
    console.log(data);  //使用回调函数的方法获取promise对象的返回值
}).catch(error=>{   //捕获throw抛出的错误
    console.log(error);
})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值