七 vue学习 async/await
1: javaScript async/await:
调用async函数的时候,是异步的,函数后面的代码继续执行。!
async / await是ES7的重要特性之一,也是目前社区里公认的优秀异步解决方案
Async(异步) 函数或多或少允许你编写顺序的 JavaScript 代码,而无需将所有逻辑包装在 callbacks(回调)
await
操作符用于等待一个 Promise
对象, 它只能在异步函数 async function
内部使用;
await
在等待 Promise 对象时会导致 async function
暂停执行, 一直到 Promise 对象决议之后才会 async function
继续执行;
若在 async
函数中 return
了一个值 x
, 不管 x
值是什么类型, async
函数的实际返回值总是 Promise.resolve(x);
await 只能出现在 async 函数中;
单一的 Promise 链并不能发现 async/await 的优势,但是,如果需要处理由多个 Promise 组成的 then 链的时候,优势就能体现出来了(很有意思,Promise 通过 then 链来解决多层回调的问题,现在又用 async/await 来进一步优化它)。
例子:
假设一个业务,分多个步骤完成,每个步骤都是异步的,而且依赖于上一个步骤的结果。我们仍然用 setTimeout
来模拟异步操作:
/**
* 传入参数 n,表示这个函数执行的时间(毫秒)
* 执行的结果是 n + 200,这个值将用于下一步骤
*/
function takeLongTime(n) {
return new Promise(resolve => {
setTimeout(() => resolve(n + 200), n);
});
}
function step1(n) {
console.log(`step1 with ${n}`);
return takeLongTime(n);
}
function step2(n) {
console.log(`step2 with ${n}`);
return takeLongTime(n);
}
function step3(n) {
console.log(`step3 with ${n}`);
return takeLongTime(n);
}
现在用 Promise 方式来实现这三个步骤的处理:
function doIt() {
console.time("doIt");
const time1 = 300;
step1(time1)
.then(time2 => step2(time2))
.then(time3 => step3(time3))
.then(result => {
console.log(`result is ${result}`);
console.timeEnd("doIt");
});
}
doIt();
// c:\var\test>node --harmony_async_await .
// step1 with 300
// step2 with 500
// step3 with 700
// result is 900
// doIt: 1507.251ms
输出结果 result
是 step3()
的参数 700 + 200
= 900
。doIt()
顺序执行了三个步骤,一共用了 300 + 500 + 700 = 1500
毫秒,和 console.time()/console.timeEnd()
计算的结果一致。
如果用 async/await 来实现呢,会是这样
async function doIt() {
console.time("doIt");
const time1 = 300;
const time2 = await step1(time1);
const time3 = await step2(time2);
const result = await step3(time3);
console.log(`result is ${result}`);
console.timeEnd("doIt");
}
doIt();
结果和之前的 Promise 实现是一样的,但是这个代码看起来是不是清晰得多,几乎跟同步代码一样
2: Promise
最新文章
- Servlet读取Excel标准化数据库过程记录
- Office组件之Spire.XLS的DotNet操作
- JavaScript——99乘法表
- Codeforces Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) B. Batch Sort(暴力)
- LeetCode Remove Duplicate Letters
- XListView刷新
- [阅读]个人阅读作业week7
- 无边框窗体、用户控件、Timer控件
- 机器学习中的数学(4)-线性判别分析(LDA), 主成分分析(PCA)
- java三种工厂模式
- ASP.NET获取服务器文件的物理路径
- Oracle EBS-SQL (INV-6):检查监督帐户别名处理.sql
- Java线程详解----借鉴
- 微软连续12年成为Gartner分析和BI平台魔力象限的领导者
- 老K漫谈区块链的共识(1)——免信任的共识机制
- Haproxy Nginx cluster构建
- sbb指令
- 记Git报错-refusing to merge unrelated histories
- Windows 下环境变量设置(命令行)
- [基础篇] 玄机网C#培训课程-初级.
热门文章
- matlab 学习之常用函数2
- ASP.NET动态网站制作(9)-- JQ(1)
- Unity3D自定义编辑器简单实例
- Tensorflow教程
- sql server charindex函数和patindex函数详解(转)
- 九度OJ 1005:Graduate Admission (排序)
- Software-defined networking
- Linux就该这么学--Shell脚本条件语句(二)
- Pentaho BIServer Community Edtion 6.1 使用教程 第四篇 安装和使用Saiku 插件 进行 OLAP
- 【linux】top更改排序顺序