JavaScript学习2——异步编程Promise&&async/await

本文详细介绍了async/await和Promise在JavaScript中的使用,包括Promise的基本概念、链式调用、错误处理,以及async函数的用法,如直接接收值、async函数返回值和Promise对象。同时,讨论了如何处理异步操作中的错误情况,是理解现代JavaScript异步编程的核心内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 关系

asyncawait是基于promise函数es6新特性。async将函数包装成promise。await等待异步执行结束。

2. 用法

2.1 Promise

  • promise对象在构建的时候会执行其参数中传入的函数excutor,此函数的执行是同步的。
    then中参数传递的函数的执行是异步的,then中有两个参数,分别传递两个函数,第一个函数是excutor中执行resolve(…)之后会自动执行的,第二个参数是excutor中执行reject(…)之后会自动执行的。
    then的回调函数中可以返回Promise对象或者一个值,从而构成链式编程,从上到下依次异步执行。返回一个值的时候会自动被包装成一个状态为fulfiled状态并且带此值的Promise对象。从而可以继续链式编程。
    resolve和reject中都可以填入参数,此参数会被下一个then接收,可以在then的回调函数中设置带一个参数data,这样就可以拿到参数。
new Promise((resolve, reject)=>{
	resolve(data);/reject(reason);
}).then((data)=>{...},(reason)=>{...})
[.then(...){}]
  • 另一种执行方法
Promise.resolve(data).then((data)=>{...});
  • 通过函数封装Promise对象
let func = function(){
	return new Promise((resolve,reject)=>{
	...;
	resolve(data);
});

func().then((data)=>{...});
}
  • 处理错误的情况
    【注】Promise的then,catch,finally方法接收的参数都是函数。
    then可以接收两个带参函数
    分别对应resolve和reject。当then接收两个函数作为参数时,不用再用catch,即便用了catch也不会执行。
    当then接收一个函数作为参数
    默认为resolve执行的情况,此时需要用catch来判定reject执行的情况。
    finally接收一个不带参数的函数作为回调函数。
let func = function(){
    return new Promise((resolve,reject)=>{
        reject("出错");
    });
}

func().then((data)=>{
    console.log('suc');
},(reason)=>{
    console.log('then' + reason);
}).finally(()=>{console.log('finally')});

2.2 async/await

await只能在async修饰的函数中使用。

  • 使用方式1——直接接收一个值
console.log(1);
async function func(){
    console.log(2);//await上面的语句依然是同步执行
    let data = await 3;//先将3装箱为Promise{3},而后await解包提取出3
    //await下面的语句被当成一个微任务添加入队列
    console.log(4);
    console.log(data);
}
func();
console.log(5);

out:
1
2
5
4
3
  • 使用方式2——await接收一个async函数的返回值
async function func(){
    return 1;//会被自动装箱成Promise{1}
}

async function ffunc(){
    console.log(2);
    let data = await func();
    console.log(3);
    console.log(data);
}

ffunc();
console.log(4);
  • 使用方式3——接收Promise对象
let func = function(){
    return new Promise(resolve => {
        resolve(1);
    });
}

async function ffunc(){
    console.log(2);
    let data = await func();//promise对象被解包
    console.log(3);
    console.log(data);
}
ffunc();
  • 接收到错误的情况
let func = function(){
    return new Promise((resolve,reject) => {
        reject("出错了");
    });
}

async function ffunc(){
    console.log(2);
    //使用try{}catch(e){...}包裹await及其下面的代码,可以实现对reject(data)的接收处理
    try{
        let data = await func();
        console.log(3);
        console.log(data);
    }catch(error){//error中即为reject中传递的参数
        console.log(error);
    }
}
ffunc();
出现这个错误的原因是在导入seaborn包时,无法从typing模块中导入名为'Protocol'的对象。 解决这个问题的方法有以下几种: 1. 检查你的Python版本是否符合seaborn包的要求,如果不符合,尝试更新Python版本。 2. 检查你的环境中是否安装了typing_extensions包,如果没有安装,可以使用以下命令安装:pip install typing_extensions。 3. 如果你使用的是Python 3.8版本以下的版本,你可以尝试使用typing_extensions包来代替typing模块来解决该问题。 4. 检查你的代码是否正确导入了seaborn包,并且没有其他导入错误。 5. 如果以上方法都无法解决问题,可以尝试在你的代码中使用其他的可替代包或者更新seaborn包的版本来解决该问题。 总结: 出现ImportError: cannot import name 'Protocol' from 'typing'错误的原因可能是由于Python版本不兼容、缺少typing_extensions包或者导入错误等原因造成的。可以根据具体情况尝试上述方法来解决该问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [ImportError: cannot import name ‘Literal‘ from ‘typing‘ (D:\Anaconda\envs\tensorflow\lib\typing....](https://blog.csdn.net/yuhaix/article/details/124528628)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值