首页 > 编程语言 >Javascript(笔记54) - promise - 4 async函数、await表达式、结合示例

Javascript(笔记54) - promise - 4 async函数、await表达式、结合示例

时间:2022-11-27 12:33:59浏览次数:55  
标签:示例 54 await Promise result promise async main

本套笔记,是基于尚硅谷的课程整理

​Javascript(笔记51) - promise - 1 介绍与基本使用 ​

​Javascript(笔记52) - promise - 2 API和方法​

​Javascript(笔记53) - promise - 3 几个关键问题​

​Javascript(笔记54) - promise - 4 async函数、await表达式、结合示例​

补充:

​Javascript(笔记38) - ES6特性 - Promise​

​Javascript(笔记45) - ES8特性 - async 和 await​


async 函数

1)函数的返回值为 Promise 对象;

2)Promise 对象的结果由 Async 函数执行的返回值决定;

async function main() {

}
let result = main();
console.log(result); // promise

一个空的 async 函数,返回的也是 promise 对象,值是 undefined ,状态是成功; 

一般在谈 Promise 对象的结果,都是指两个东西:对象的状态 和 对象的值;

也就是说: result 是Promise对象,状态 PromiseState: fulfilled ; 值 PromiseResult: undefined; 


Async 函数执行的返回值一般有三种情况:Promise 对象、非Promise类型的数据和抛出异常

1)非Promise类型的数据:数值、字符串、布尔值等;

async function main() {
return 123;
// return "hello async";
// return true;
}
let result = main();
console.log(result); // promise 状态:成功

这种非Promise类型的数据,如:数字、字符串和布尔值等,直接决定 result 的状态是成功,函数返回值即为 result 的值;

2)Promise对象:返回值可以是 resolve(),也可以 reject(); 

async function main() {
return new Promise((resolve,reject)=>{
resolve('Ok');
// reject('Err');
});
}
let result = main();
console.log(result); // promise 状态:成功

返回的是 resolve() : result 的状态就为成功,值为 “Ok”; 

返回的是 reject():  result 的状态就是失败,值为 “Err”;

3)抛出异常:返回值是错误;

async function main() {
throw "oh No";
}
let result = main();
console.log(result); // promise 状态:失败; 值: oh No
result.catch(reason=>{ // 失败状态的Promise需要一个方法来处理失败,不然会报错
console.log(reason);// oh No;
});

返回值是错误,决定了 result 的状态是失败,这种失败的状态还需要一个方法来处理失败,如:catcth(),输出的失败值即为错误信息:oh No; 

Async 函数返回的 Promise对象的结果,跟 then() 方法返回 Promise对象的结果一样;

可以参考MDN:​​Async​


await 表达式

1) await 右侧的表达式一般为 promise 对象,但也可以是其它的值;

2)如果表达式是 Promise 对象,await 返回的是 promise 的值;

3)如果表达式是其他值,直接将此值作为 await 的返回值;

注意:

1)await 必须写在 async 函数中,但 async 函数中可以没有 await;

2)如果 await 的 Promise 失败了,就会抛出异常,需要通过 try...catch 捕获处理;

await 10;

语法错误:Uncaught SyntaxError: await is only valid in async functions and the top level bodies of modules.

await 必须写在 async 函数中;

第1种情况:右侧不是 promise对象,是一个其他类型的值,那 result 的值就是这个值;

async function main() {
// 1. 右侧不是 Promise 对象
let result = await 20;
console.log(result); // 20
}
main();

第2种情况:右侧是一个 promise对象(状态成功),那么 result 的值就是 Promise对象的值;

async function main(){    
let p = new Promise((resolve,reject)=>{
resolve('Ok');
});
// 2. 右侧是一个 promise 对象;
let result = await p;
console.log(result); // Ok
}
main();

第3种情况:右侧Promise对象状态是失败的话,那就要使用 try...catch 来捕获处理;

async function main() {
let p = new Promise((resolve, reject) => {
// resolve('Ok');
reject("Err");
});
try{
let result = await p;
console.log(result);
}catch(e){
console.log(e); // Err
}
}
main();

可以参考MDN:​​await​


结合示例1

在node环境,读取 res 文件夹中的三个文件: 1.md / 2.md / 3.md; 

回调写法:

const fs = require('fs');
fs.readFile('./res/1.md', (err, data1) => {
if (err) throw err;
fs.readFile('./res/2.md', (err, data2) => {
if (err) throw err;
fs.readFile('./res/3.md', (err, data3) => {
if (err) throw err;
console.log(data1 + data2 + data3);
});
});
});

Javascript(笔记54) - promise - 4 async函数、await表达式、结合示例_async函数

这种做法会形成回调地狱,不便维护;

async 和 await 写法:

const fs = require('fs');
const util = require('util');
const mineReadFile = util.promisify(fs.readFile); // 之前有介绍过 util.promisify 方法
async function main(){
try{
let data1 = await mineReadFile('./res/1.md');
let data2 = await mineReadFile('./res/2.md');
let data3 = await mineReadFile('./res/3.md');
console.log(data1+data2+data3);
}catch(e){
console.log(e);
}
};
main();

 这样看起来非常简洁,看起来像同步调用,其实内部执行是异步的;


结合示例2

async 与 await 结合发送 AJAX 

<button id="btn">点击获取图片</button>
<script>
// 之前封装的发送 ajax 的函数
function sendAjax(url) {
return new Promise((fulfill, reject) => {
const xhr = new XMLHttpRequest();
xhr.responseType = "json";
xhr.open("GET", url);
xhr.send(null);
// 处理结果,绑定事件
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status >= 200 && xhr.status < 300) {
fulfill(xhr.response);
} else {
reject(xhr.status);
}
}
}
});
}

let btn = document.querySelector('#btn');
btn.addEventListener('click', async function () {
try {
let pics = await sendAjax('https://api.apiopen.top/api/getImages?page=0&size=10');
console.log(pics);
} catch (e) {
console.log(e);
}
});

</script>

调用公共接口的图片信息,点击按钮执行;

Javascript(笔记54) - promise - 4 async函数、await表达式、结合示例_javascript_02

注意:

sendAjax() 是之前封装的AJAX返回 promise 对象的函数;

await 必须放在 async 的函数里,所以 绑定回调函数中,要加上 async ;

使用 try...catch 来容错;





标签:示例,54,await,Promise,result,promise,async,main
From: https://blog.51cto.com/ahuiok/5889947

相关文章

  • Java:Spring Boot整合mybatis-plus示例
    文档​​https://start.spring.io/​​mybatis-plus​​文档​​​|​​github​​maven​​文档​​p6spy​​文档​​​|​​github​​使用示例目录​​使用示......
  • pytorch torchvision.ops.roi_align 示例
    importtorchvisionimporttorchinput_=torch.rand(3,128,24,96)#[b,c,h,w]bbox=[[0,0.1,0.15,0.4,0.6],[0,0.1,0.15,0.4,0.6],[1,0.01,0.15,0.4,0......
  • 力扣454 四数相加
    题目:给四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,k,l)能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+......
  • ECMAScript 2022 & Top-level await All In One
    ECMAScript2022&Top-levelawaitAllInOneES2022/ES13https://caniuse.com/sr_es13Top-levelawaithttps://caniuse.com/mdn-javascript_operators_await_......
  • 配置IS-IS基本功能示例
    介绍IS-IS基本功能的配置过程,包括在各设备上指定网络实体名、配置level级别和使能IS-IS。组网需求如下图所示:DeviceA、DeviceB、DeviceC和DeviceD之间通过IS-IS协议实......
  • Orleans基础知识以及使用示例
    Orleans简介Orleans是一个与ABP齐名,支持有状态云生应用/服务水平伸缩的基于VirtualActor模型的.NET分布式应用框架。 Actor模型简单来讲:Actor模型=状态+行为......
  • 高德地图JS API示例标记点 拿来即用
    使用最新高德JSAPI2.0先看效果在官方示例基础上做了些改动很多控件在初始化添加即可:如小窗口,指南针等,根据自己的需要加吧html代码<!doctypehtml><html><head>......
  • 服务器对象错误"ASP 0177:80040154"Server.CreateObject
    1,症状:试图运行一个使用Server.CreateObject实例化一个ActiveX组件的活动服务器页面(ASP)页时出现以下错误消息:服务器对象错误ASP0177:80040154Server.CreateObjec......
  • uni-ajax使用示例
    官网基于Promise的轻量级uni-app网络请求库uni-ajax官网:https://uniajax.ponjs.com安装插件市场在插件市场右上角选择使用HBuilderX导入插件或者下载插件......
  • 使用c#的 async/await编写 长时间运行的基于代码的工作流的 持久任务框架
    持久任务框架(DTF)是基于async/await工作流执行框架。工作流的解决方案很多,包括WindowsWorkflowFoundation,BizTalk,LogicApps,Workflow-Core和Elsa-Core。最近我在Da......