异步编程Promise和async+await

异步编程

1.node.js工作原理

1.1同步方式执行

代码一行一行执行,下一行的代码必须等待上一行代码执行完成后才能执行;

1.2异步方式

代码在执行过程中某行代码需要耗时,代码执行不会等待耗时操作完成以后再去执行下一行代码,而不是等待直接向后执行,异步代码的执行结果需要通过回调函数的方式处理;

1.3代码执行顺序
console.log('代码开始执行');
setTimeout(() => {
    console.log('2秒后执行的代码');
}, 2000); 
setTimeout(() => {
    console.log('"0秒"后执行的代码');
}, 0);
console.log('代码结束执行');

2.Promise

1.Promise出现的目的是为了解决node.js异步编程中的回调地狱问题;

2.Promise本身是一个构造函数,要使用promise解决回调地狱的问题,需要使用new运算符创建Promise构造函数的实例对象;

在创建对象的时候需要传入一个匿名函数,匿名函数中有两个参数resolve,reeject;

const fs = require('fs');
//promise的目的`是为了解决回调函数地狱
let promise = new Promise((resolve,reject)=>{
    fs.readFile('./1.txt','utf8',(err,result)=>{
        if(err != null){
            //文件读取错误时调用的函数,并且输出错误信息
            reject(err);
        }
        else{
            //正确的时候调用resolve函数,输出正确信息
            resolve(result);
        }
    })
})
// promise.then就是文件读取正确时的信息
//链式的,后边跟上.catch就是文件读取错误时输出错误信息
promise.then((result)=>{
    console.log(result);
}).catch((err)=>{
    console.log(err);
})

3.异步函数

异步函数是异步编程语法的终极解决方案,它可以让我们将异步代码写成同步的形式,让代码不在有回调嵌套,代码变得简洁易懂;

const fn = async () => {};
async function fn() {};
async

1.普通函数定义前边加async关键字,普通函数变为异步函数;

2.异步函数默认返回promise对象;

3.在异步函数内部使用return关键字进行结果返回,结果会被包裹的promise对象中,return关键字代替了resolve方法;

4.在异步函数内部使用throw关键字抛出程序异常;

5.调用异步函数再链式调用then方法获取异步函数执行结果;

6.调用异步函数再链式调用catch方法获取异步函数执行的错误信息;

await

await只出现在异步函数中;

await promise await后面只能写promise对象,写其他的类型的API是不可以的;

await关键字 可以暂停异步函数的执行,等待promise对象返回结果后再向下执行函数;

// 在普通函数定义的前边加上async关键字,普通函数就变成了异步函数
async function p1(){
    return 'p1';
}
async function p2(){
    return 'p2';
}
async function p3(){
    return 'p3';
}
// 异步函数默认的返回值是promise对象
console.log(p1()) //打印p1函数的返回值,Promise { 'p1' } 是promise对象
async function run(){
    let r1 = await p1()
    let r2 = await p2()
    let r3 = await p3()
    console.log(r1);
    console.log(r2);
    console.log(r3);
}
run();

4.promisify改造函数

// 改造现有异步函数api 让其返回promise对象 从而支持异步函数语法
const promisify = require('util').promisify;
// 调用promisify方法改造现有异步API 让其返回promise对象
const readFile = promisify(fs.readFile);
const fs = require('fs');
//改造现有异步函数api,让其返回promise对象,从而支持异步函数语法
//引入系统模块util下边的方法promisify方法
const promisify = require('util').promisify;
//调用promisify方法改造现有异步API  让其返回promise对象 promise的目的是为了解决回调函数地狱
const readFile = promisify(fs.readFile);

// 普通函数定义前边加上async关键字,普通函数就会变为异步函数,异步函数返回值为promise对象
//await关键字只能出现在异步函数中
// await promise  await后面只能写promise对象,写其他类型不可以
//await 关键字可是暂停异步函数向下执行,知道promise返回结果
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();
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: async/await 是异步编程的一种方式,它可以让我们以同步的方式编写异步代码。async/await 的本质是基于 Promise 的,它通过将异步操作封装成 Promise 对象,然后使用 async/await 语法糖来简化 Promise 的使用,从而实现异步编程的同步化。因此,async/await 既包含异步的特性,也具备同步的表现形式。 ### 回答2: async await是异步编程的一种方式。在JS中,异步编程通过回调函数、Promise对象、Generator函数等实现,但代码可读性并不高,而async/await可以让异步代码的语法更加简洁易读。 async/await实际上是基于Promise实现的,它是一个语法糖,内部使用Promise来管理异步操作。async函数返回一个Promise对象,当函数内部遇到await关键字时,则会暂停函数执行,等待异步操作返回结果,然后继续执行async函数。 当使用async/await时,同步代码的执行顺序仍然是同步的,但异步操作的执行顺序是异步的。如下代码: ``` async function test() { console.log('start') let result = await new Promise(resolve => { setTimeout(() => { resolve('async/await') }, 1000) }) console.log(result) console.log('end') } test() console.log('main') ``` 输出结果为: ``` start main async/await end ``` 从输出结果可以看出,test()函数内部的异步操作是异步执行的,但test()函数本身的执行顺序是同步的。而test()函数返回一个Promise对象,当调用test()函数时,会先输出'main',再输出'async/await',最后输出'end'。 总之,async/await是异步编程的一种方式,它通过简洁的语法糖让我们更易读地编写异步代码,但底层仍然是异步执行的。 ### 回答3: async/await是异步编程的一种方式,它将异步操作转变为同步流程,使得异步代码看起来像同步代码一样易于理解和维护。 JavaScript是单线程的语言,而且在执行异步操作时,原本的线程会被阻断,导致代码无法继续执行,影响用户体验。因此,JavaScript引入了异步操作的概念,利用回调函数、Promiseasync/await等机制来实现异步编程。其中,async/await是ES2017新增的异步编程解决方案,它通过async函数和await操作符来实现异步操作的等待和顺序执行。 在使用async/await进行异步编程时,代码看起来像同步代码一样顺序执行,但实际上async函数内部的异步操作仍然是异步执行的。异步操作会在后台执行,并不会阻塞主线程的执行,因此async/await仍然是异步编程的一种方式。 需要注意的是,在使用async/await进行异步编程时,需要保证所有的异步操作都返回一个Promise对象,否则await操作将会报错。此外,如果async函数内部有多个await操作,则它们的执行顺序是串行的,即等待上一个操作完成后再执行下一个操作,从而保证异步操作的顺序性和一致性。 综上所述,async/await是一种异步编程方式,它通过将异步操作转换为同步流程来使得异步代码易于理解和维护。同时,需要保证所有异步操作都返回Promise对象才能使用await操作,并且await操作会串行执行,保证异步操作的一致性和顺序性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值