你真的会用async和await么?

news/2024/11/6 11:34:58/

背景

背景就是遇到了一个比较烦人的模块,里面的涉及到了大量的async 和 awiat。发现大多人对这个语法糖一知半解,然后大量的滥用,整理一下

async

前置知识:

 Promise.resolve('foo)   ===    new Promise(resolve => resolve('foo'))Promise.reject('foo)    ===  new Promise((resolve, reject) => reject('出错了'))

1、async修饰的函数返回一个promise

async function myName() {let result = await Promise.resolve("hello")let result1 =  await Promise.resolve("hello1")console.log(result)console.log(result1)
}
myName().then(e => console.log(e))
//hello
//hello1
//undefined (函数没有返回任何的值所以是undefined)---------------------
async function myName() {let result = await Promise.resolve("hello")let result1 =  await Promise.resolve("hello1")return ({result,result1})
}
myName().then(e => console.log(e))
// { result: 'hello', result1: 'hello1' }

2、注意以下用法,以下用法在项目中使用是极多的

i:以下的这种写法就很好理解了,没问题的

function timeout(ms) {return new Promise((resolve) => {setTimeout(resolve, ms);});
}
async function asyncPrint(value, ms) {await timeout(ms);console.log(value);
}asyncPrint('hello world', 50)
// hello world

ii:因为async返回一个promise,所以下述写法完全等同于i的写法

async function timeout(ms) {await new Promise((resolve) => {setTimeout(resolve, ms);});
}
async function asyncPrint(value, ms) {await timeout(ms);console.log(value);
}
asyncPrint('hello world', 50)
// hello world

在这里插入图片描述

async function timeout(ms) {await new Promise((resolve) => {setTimeout(resolve, ms);});console.log(8888)
}
async function asyncPrint(value, ms) {let res =  timeout(ms)console.log(res) console.log(value);
}
asyncPrint('hello world', 50)
// Promise { <pending> }
// hello world
// 8888
async function timeout(ms) {await new Promise((resolve) => {setTimeout(resolve, ms);});console.log(8888)
}async function asyncPrint(value, ms) {let res =  timeout(ms)console.log(res) await timeout(ms);console.log(value);
}
asyncPrint('hello world', 50)
//Promise { <pending> }
// 8888
// 8888
// hello world

await

await修饰异步,在async中使用,当promise是resolve时接着往下走

1、awiat(直接用),只能接收resolve返回的参数

async function myName() {let result = await Promise.resolve("hello")let result1 = await Promise.resolve("hello1")console.log(result)console.log(result1)
}
myName()
// hello
// hello1
async function myName1() {let result = await Promise.reject("hello")console.log(result)
}
myName1()
// 报错了
------------
async function myName1() {let result = await Promise.reject("hello")console.log(111111111111111)console.log(result)
}
myName1()
// 报错了(console都没走)

2、搭配 try catch 可以用 catch捕捉到reject的错误

async function myName2() {try {let result = await Promise.reject("hello")console.log(result)} catch (error) {console.log('出错了',error)}
}
myName2()
// 出错了 hello

3、try catch ,try内之要有一个promise reject,那么后续的就都不会进行了,直接将第一个reject给catch给出去了

async function myName2() {try {let result = await Promise.reject("hello")console.log(result)let result1 = await Promise.resolve("hello word")console.log(result1)} catch (error) {console.log('出错了',error)}
}
myName2()
// 出错了 hello
----------------------------------------
// 下方demo为了证明,报错后没有再往后走
async function myName2() {try {await Promise.reject("hello")console.log('走不走')let result1 = await Promise.resolve("hello word")console.log(result1)} catch (error) {console.log('出错了',error)}
}
myName2()
// 出错了 hello

   function name() {try {throw new Error('出错了');console.log(1111);} catch (e) {console.log(e);}}

如果抛出错误 throw new Error 就不在往下走了,不会执行执行打印,走到了catch

    async onSubmit() {this.lastClickEvent = this.CLICK_EVENT.ADD;try {await this.commonAdd();this.$message({type: 'success',message: this.$t('msg_success')});if (this.isClient) {this.SynchronizeResourceUpdate();}if (!this.accessGuide) {this.back();}} catch (error) {console.log(error);}},

commonAdd如果有throw new Error也就不往下走了,try catch被中断

await 结果接收

await将结果赋值,只能在正确(resolve)的时候处理

async function ll() {let w = await Promise.resolve('出错了');console.log(w);let y = await Promise.resolve('hello');console.log(y);
}
ll();
// 出错了
// hello
async function ll() {let w = await Promise.reject('出错了');console.log(w);let y = await Promise.reject('hello');console.log(y);
}
ll(); 
// Promise {<rejected>: "出错了"}

http://www.ppmy.cn/news/950943.html

相关文章

mysql 第六章

目录 1.子查询 2.exists 3.as 别名 4.视图 5.null 6.连接查询 7.总结 1.子查询 2.exists 3.as 别名 4.视图 5.null 6.连接查询 7.总结 对 mysql 数据库的查询&#xff0c;除了基本的查询外&#xff0c;有时候需要对查询的结果集进行处理。

省去麻烦的环境配置,一分钟来试试 chatgpt API 代码⚡

项目地址&#xff1a;https://github.com/wjsvec/try_chatgpt_API_in_one_minute try chatgpt API in one minute⚡ 这个项目用来做什么&#x1f60a; 由于一些特殊的网络原因&#xff0c;在试用 chatgpt 的 API 的时候总是遇到奇奇怪怪的问题&#x1f62b;&#xff0c;有时…

ChatGPT API调用+服务器部署【附Git地址】

文章目录 一、关键代码二、使用步骤1.获取代码2.服务器部署 总结 运行对话效果图 一、关键代码 public class Main {public static final String URL "https://api.openai.com/v1/chat/completions";// 你的 API KEYpublic static final String APT_KEY "sk…

利用Cloudflare搭建ChatGPT API 代理服务器 傻瓜教程

✈ChatGPT的API接口为 https://api.openai.com 但是很多小伙伴不是国家区域不对&#xff0c;就试没有一个好的代理&#xff0c;经常chatgpt出现无法聊天的情况&#xff0c;那么自己搭建一个代理服务器那不是很香&#xff1f;还是免费的&#xff0c;直接整起来&#xff01;图文教…

ChatGPT API的使用(一)

OpenAI除了提供ChatGPT聊天功能外&#xff0c;还提供了功能强大的图片生成与编辑功能&#xff0c;以及代码注释、语音转换功能&#xff0c;而这些功能需要通过API进行访问。 首先需要生成您的帐户独有的 API 密钥。访问此页面并创建一个新的密钥。 在这里需要点击复制&#xf…

如何实现基于ChatGPT API的C#接入?

今年开年&#xff0c;最火的莫过于ChatGPT的相关讨论&#xff0c;这个提供了非常强大的AI处理&#xff0c;并且整个平台也提供了很多对应的API进行接入的处理&#xff0c;使得我们可以在各种程序上无缝接入AI的后端处理&#xff0c;从而实现智能AI的各种应用。ChatGPT的API可以…

chatgpt API接口中文说明介绍(二)

提示&#xff1a;如果你认为本文对你有帮助&#xff0c;请点一下关注&#xff0c;后面会有更多人工智能方面的文章。 文章目录 前言一、示例代码二、参数说明总结 如果有问题可以联系我**&#xff1a;https://gitee.com/xiaoyuren/gpt3 前言 上一篇介绍了chatgpt的 接口和使用…

Chatgpt api 多轮对话功能实现

不废话&#xff0c;上代码 import requests import jsonurl "https://api.openai.com/v1/completions"payload json.dumps({"model": "text-davinci-003","prompt": "日照香炉生紫烟&#xff0c;遥看瀑布挂前川&#xff0c;飞…