ES7中的async和await
ES7中的async和await
在上一章中,使用Promise将原本的回调方式转换为链式操作,这就将一个个异步执行的操作串在一条同步线上了。下一次的操作必须等待当前操作的结束。
使用Promise的最后,遇到了一个问题,就是如果要对已经获得数据数组进行遍历,并在遍历中继续对每一条数据做异步请求操作,这就构成了一个树状查询。
蠢办法
对于上述问题,我们完全可以用上一章中的垃圾代码来构建一个for循环的嵌套then!
但上一章已经说过,千万不要写出这种垃圾代码,所以如果你的node或者浏览器并不支持ES6,7标准的话,完全可以采用传统多层嵌套回调地狱来实现树状查询,但带来的问题,树大了,嵌套会看起来十分恶心。
使用async和await
在ES7标准中,最为人津津乐道的无非是新增的“async”,“await”语法糖了。
来看下面使用代码这两个语法解决上述问题:
(async function(){
const sql1 = "select * from student_base_info limit 10";
let res1 = await query(sql1);
for(let r of res1){
console.log(`学号:${r.学号}`);
let res2 = await query(`select * from student_school_info where 学号='${r.学号}'`)
for(let r2 of res2)
console.log(r2.单位);
}
})()
注意:
- await的作用就是等待Promise的resolve的出现,这个过程是阻塞的。
- await必须放在async function之中,目前最外层的那个看着多余的async,官方正在解决中。
- 使用了await就不必使用then来接受异步操作的返回值,而是直接赋值给变量即可,所赋的值就是resolve给出的值。
关于错误与异常
在使用链式then操作时,是在最后加上catch()来获得reject给出的错误或异常(reject是负责给出异步活动中的错误),如果使用的是await,则需要用到try catch块来抛出reject的异常。
(async function(){
try{
const sql1 = "select * from student_base_info limit 10 sss";
let res1 = await query(sql1);
for(let r of res1){
console.log(`学号:${r.学号}`);
let res2 = await query(`select * from student_school_info where 学号='${r.学号}'`)
for(let r2 of res2)
console.log(r2.单位);
}
}catch(err){
console.log("错误")
console.log(err)
}
})()
数据库封装函数:query
"use strict";
const mysql = require("mysql");
const conn = {
host:"localhost",
user:"root",
password:"",
database:"cslginfo"
};
function query(sql){
let pool = mysql.createPool(conn);
return new Promise(function(resolve,reject){
pool.getConnection(function(err,conn){
if(err) reject(err);
conn.query(sql,function(err,res,fields){
if(err) reject(err);
else resolve(res);
});
});
});
}
ES7中的async和await的更多相关文章
- ES7中的async 和 await
async 和 await 一个函数如果加上 async ,那么该函数就会返回一个 Promise async function test() { return "1" } con ...
- 理解ES7中的async/await
理解ES7中的async/await 优势是:就是解决多层异步回调的嵌套 从字面上理解 async/await, async是 "异步"的含义,await可以认为是 async w ...
- 在Node中使用ES7新特征——async、await
async与await两个关键字是在ES7中添加的新特征,旨在更加直观的书写异步函数,避免出现callback hell. callback hell是什么? readFileContents(&qu ...
- [译] C# 5.0 中的 Async 和 Await (整理中...)
C# 5.0 中的 Async 和 Await [博主]反骨仔 [本文]http://www.cnblogs.com/liqingwen/p/6069062.html 伴随着 .NET 4.5 和 V ...
- 在MVC中使用async和await的说明
首先,在mvc中如果要用纯异步请不要使用async和await,可以直接使用Task.Run. 其次,在mvc中使用async和await可以让系统开新线程处理Task的代码,同时不必等Task执行结 ...
- C# 中的Async 和 Await 的用法详解
众所周知C#提供Async和Await关键字来实现异步编程.在本文中,我们将共同探讨并介绍什么是Async 和 Await,以及如何在C#中使用Async 和 Await. 同样本文的内容也大多是翻译 ...
- async和await的使用总结 ~ 竟然一直用错了c#中的async和await的使用。。
对于c#中的async和await的使用,没想到我一直竟然都有一个错误.. ..还是总结太少,这里记录下. 这里以做早餐为例 流程如下: 倒一杯咖啡. 加热平底锅,然后煎两个鸡蛋. 煎三片培根. 烤两 ...
- ES2017 中的 Async 和 Await
ES2017 在 6 月最终敲定了,随之而来的是广泛的支持了我最喜欢的最喜欢的JavaScript功能: async(异步) 函数.如果你也曾为异步 Javascript 而头疼,那么这个就是为你设计 ...
- .NET中的async和await关键字使用及Task异步调用实例
其实早在.NET 4.5的时候M$就在.NET中引入了async和await关键字(VB为Async和Await)来简化异步调用的编程模式.我也早就体验过了,现在写一篇日志来记录一下顺便凑日志数量(以 ...
随机推荐
- TF利用分布式队列控制线程
假设分布式任务包含n个ps节点, m个worker节点. m, n>0. 希望所有worker的任务结束后,所有节点才终止. 方法: 借助队列tf.FIFOQueue实现. 原理: tf.FIF ...
- Spring Cloud Hystrix熔断器隔离方案
Hystrix组件提供了两种隔离的解决方案:线程池隔离和信号量隔离.两种隔离方式都是限制对共享资源的并发访问量,线程在就绪状态.运行状态.阻塞状态.终止状态间转变时需要由操作系统调度,占用很大的性 ...
- python学习笔记-字符串的拼接
1.百分号方式拼接 %[(name)][flags][width].[precision]typecode (name) 可选,用于选择指定的key flags 可选,可供 ...
- Python中列表的copy方法
1.在列表中存在一个名为copy的方法,就像字面意思一样copy方法是用于复制列表元素的,示例如下: names = [‘Zhangsan’,’Lisi’,’WangErgou’] names2 = ...
- miniconda安装jupyter
1.安装jupyter 由于miniconda是anaconda的简化版,只有一个prompt: 安装jupyter,只需要打开prompt的dos窗口,输入命令pip install jupyter ...
- JavaSE--对象克隆
当拷贝一个变量时,原始变量与拷贝变量引用同一个对象,这就是说,改变一个变量所引用的对象将会对另一个变量产生影响. 如果创建一个对象的新的 copy,他的最初状态与 original 一样,但以后将可以 ...
- gcc -S xx
编译器的核心任务是把C程序翻译成机器的汇编语言(assembly language).汇编语言是人类可以阅读的编程语言,也是相当接近实际机器码的语言.由此导致每种 CPU 架构都有不同的汇编语言. 实 ...
- PyTorch基础——词向量(Word Vector)技术
一.介绍 内容 将接触现代 NLP 技术的基础:词向量技术. 第一个是构建一个简单的 N-Gram 语言模型,它可以根据 N 个历史词汇预测下一个单词,从而得到每一个单词的向量表示. 第二个将接触到现 ...
- java.lang.AbstractMethodError: org.slf4j.impl.JDK14LoggerAdapter.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)V
java.lang.AbstractMethodError: org.slf4j.impl.JDK14LoggerAdapter.log(Lorg/slf4j/Marker;Ljava/lang/St ...
- @ResponseBody与@RestController
@ResponseBody与@RestController的作用与区别 https://blog.csdn.net/xfl4629712/article/details/78528387