setTimeout模拟请求,使用async和await改写的一些注意地方
https://blog.csdn.net/weixin_41033048/article/details/114979233
通过定时器模拟异步数据请求并引入promise处理的方法过程。
一、依次输出1,2,3
setTimeout(() => {
console.log(1);
setTimeout(() => {
console.log(2);
setTimeout(() => {
console.log(3);
}, 1000);
}, 1000);
}, 1000);
1
2
3
4
5
6
7
8
9
二、通过promise处理这些请求
new Promise((res, rej) => {
setTimeout(() => {
res();
}, 1000);
}).then(() => {
console.log(1);
return new Promise((res, rej) => {
setTimeout(() => {
res();
}, 1000);
})
}).then(() => {
console.log(2);
return new Promise((res, rej) => {
setTimeout(() => {
res();
}, 1000);
})
}).then(() => {
console.log(3);
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
三、很关键的一步,使用async 和 await来改装很长的.then()调用链
( async ()=>{
await new Promise((res,rej)=>{
setTimeout(() => {
console.log(1);
}, 1000);
})
await new Promise((res,rej)=>{
setTimeout(() => {
console.log(2);
}, 1000);
})
await new Promise((res,rej)=>{
setTimeout(() => {
console.log(3);
}, 1000);
})
})()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
在这里突然发现,只输出了一个1, 打开调试工具后台,发现执行完了一个就停止往下走了,思索原因就是,await等待的是promise执行的返回值resolve()或者是reject();因此await必须接new Promise,而 new Promise必须也要调用resolve()将内部返回出去。
第三步正确写法:
(async () => {
await new Promise((res, rej) => {
setTimeout(() => {
console.log(1);
res();
}, 1000);
})
await new Promise((res, rej) => {
setTimeout(() => {
console.log(2);
res();
}, 1000);
})
await new Promise((res, rej) => {
setTimeout(() => {
console.log(3);
res();
}, 1000);
})
})()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
四、我们可以不可以抽离相同部分呢,答案是可以的
function time(res, step) {
setTimeout(() => {
console.log(step);
res();
}, 1000);
}
(async () => {
await new Promise((res, rej) => {
time(res, 1);
})
await new Promise((res, rej) => {
time(res, 2);
})
await new Promise((res, rej) => {
time(res, 3);
})
})()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
这里也要注意,我们需要把resolve()调用写在里面。await需要接收这一个函数返回值。
补充一个请求有互相调用关系的例子
var total = 0;
setTimeout(() => {
total = total + 1;
setTimeout(() => {
total = total + 2;
setTimeout(() => {
total = total + 3;
console.log('总数为:', total) //6
}, 1000);
}, 1000);
}, 1000);
1
2
3
4
5
6
7
8
9
10
11
12
13
使用aync和await改造的写法
var total = 0;
(
async () => {
let acount = await new Promise((res, rej) => {
setTimeout(() => {
total = total + 1;
res(total);
}, 1000);
})
let acount2 = await new Promise((res, rej) => {
setTimeout(() => {
total = acount + 2;
res(total);
}, 1000);
})
let acount3 = await new Promise((res, rej) => {
setTimeout(() => {
total = acount2 + 3;
res(total)
}, 1000);
})
console.log('总数为:', acount3)//6
}
)();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
总结:
async和await实现的步骤
使用立即执行函数
在立即执行的函数内前面添加async
await负责接收promise数据类型的返回,所以内部必须要有resolve的返回
如果resolve有参数传送,那么可以在await的外部接收这个参数
参数可以用以后续的处理。
————————————————
版权声明:本文为CSDN博主「叶川飞流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41033048/article/details/114979233
setTimeout模拟请求,使用async和await改写的一些注意地方的更多相关文章
- [Winform]线程间操作无效,从不是创建控件的线程访问它的几个解决方案,async和await?
目录 概述 取消跨线程检查 使用委托异步调用 sync和await 总结 概述 最近在qq群里有一朋友,问起在winform中怎么通过开启线程的方式去处理耗时的操作,比如,查看某个目录下所有的文件,或 ...
- 不使用回调函数的ajax请求实现(async和await简化回调函数嵌套)
在常规的服务器端程序设计中, 比如说爬虫程序, 发送http请求的过程会使整个执行过程阻塞,直到http请求响应完成代码才会继续执行, 以php为例子 $url = "http://www. ...
- promise、async、await、settimeout异步原理与执行顺序
一道经典的前端笔试题,你能一眼写出他们的执行结果吗? async function async1() { console.log("async1 start"); await as ...
- “setTimeout、Promise、Async/Await 的区别”题目解析和扩展
解答这个题目之前,先回顾下JavaScript的事件循环(Event Loop). JavaScript的事件循环 事件循环(Event Loop):同步和异步任务分别进入不同的执行"场所& ...
- setTimeout、Promise、Async/Await 的执行顺序
问题描述:以下这段代码的执行结果 async function async1() { console.log('async1 start'); await async2(); console.log( ...
- Ajax请求回调地狱及解决方案(promise、async和await)
谈及回调地狱发生得情况和解决办法,就必须追溯到原生ajax请求. 先列出服务器提供的数据接口: // 服务器端接口 app.get('/data1', (req, res) => { res.s ...
- ES系列之Promise async 和 await
概述 promise是异步编程的一种解决方案,比传统的解决方案—回调函数和事件—更合理更强大. 所谓的promise就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作的结果). Pro ...
- Promise,Async,await简介
Promise 对象 转载:http://wiki.jikexueyuan.com/project/es6/promise.html 基本用法 ES6 原生提供了 Promise 对象.所谓 Prom ...
- 浅谈async函数await用法
今天状态不太好,睡久了懵一天. 以前只是了解过async函数,并还没有很熟练的运用过,所以先开个坑吧,以后再结合实际来更新下,可能说的有些问题希望大家指出. async和await相信大家应该不陌生, ...
- ES6中async与await的使用方法
promise的使用方法 promise简介 是异步编程的一种解决方案.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息.解决回调函数嵌套过多的情况 const promise =n ...
随机推荐
- 防抖ref如何在vue中被定义
本文由 ChatMoney团队出品 为什么ref要实现防抖 在vue的开发过程中,我们通常会使用到ref,但在我们需要对一个频繁的赋值操作做防抖操作时,我们通常只能通过编写一个独立的防抖函数来实现,这 ...
- 2025盘古石决赛-计算机&手机
手机取证 分析鸿蒙手机检材,打网球定的日期是?[标准格式:4月5日] 在日历数据中 3月3日 分析鸿蒙手机检材,哪个浏览器搜索过鸿蒙开发教程?[标准格式:百度浏览器] uc数据搜索过 UC浏览器 分析 ...
- 开源公开课丨大数据调度系统Taier任务调度介绍
一.直播介绍 前几期,我们为大家分享了Taier基本介绍.控制台.Web前端架构及数据开发介绍,本期我们为大家分享Taier任务调度介绍. 本次直播我们将从Taier的任务调度实例生成.调度及提交等方 ...
- Apache NiFi C2 Client 实现详解
项目标题与描述 Apache NiFi C2 Client 是Apache NiFi项目中的Command and Control (C2)协议客户端实现,主要用于与C2服务器进行通信,实现远程管理和 ...
- Elastic学习之旅 (6) Query DSL
大家好,我是Edison.首先说声抱歉,这个ES学习系列很久没更新了,现在继续吧. 上一篇:ES的倒排索引和Analyzer 什么是Query DSL DSL是Domain Specific Lang ...
- MySQL 02 日志系统:一条SQL更新语句是如何执行的?
比如执行一条更新语句: update T set c=c+1 where ID=2; 首先,更新语句也会走一遍查询语句的流程.除此以外,更新还涉及两个日志模块,分别是redo log和binlog. ...
- 485集线器 4口485集线器 4口485 HUB
485集线器ZLAN9440是一款上海卓岚生产的可通过一路RS485/232主口扩展出4路RS485从口的工业级隔离型4口RS485集线器.可以有效的实现RS485网络的中继.扩展与隔离.ZLAN94 ...
- 前端开发系列078-Node篇之npm
本文输出Node中和包管理有关的基本内容,即npm的使用. 一.简单介绍 npm全称Node packAge Manager是Node官方提供的包管理工具,下面列出包管理工具的功能边界. > ❏ ...
- 中大ACM个人赛 ABC题题解
摸完签到题就跑了 A - Maximum Subrectangle 题意:有个C矩阵,C[i][j] = a[i]b[j], 问你在\(\displaystyle\sum_{i=x1}^{x2}\) ...
- API开发平台,一站式API集成开发平台
RestCloud API开发平台集API服务.发布.开发.集成于一体的低代码一站式集成开发平台,是一款轻量级的Restful风格的API服务发布平台.通过RestCloud API开发平台可以快速的 ...