博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
轻松理解 async 与 await
阅读量:3959 次
发布时间:2019-05-24

本文共 1740 字,大约阅读时间需要 5 分钟。

async 与 await 是ES8 中提出的语法,主要是为了解决异步任务的回调。

这里总结了几种处理异步任务回调的方法,从中观察async是如何诞生的。

这里利用node环境下的文件读写举例。

普通回调

fs.readFile('./app.js', (err, data) => {
console.log(data.toString())})

封装Promise

function readFile(path) {
return new Promise((resolve, reject) => {
fs.readFile(path, (err, data) => {
if (err) {
reject(err) return; } resolve(data) }) })}readFile('./app.js') .then(res => {
console.log(res.toString()) }) .catch(err => {
console.log(err) })

node 工具 Promisify

与封装Promise差不多,只是封装这一步,node替你做了而已。

const promisify = require('util').promisifyconst readFile = promisify(fs.readFile)readFile('./app.js')    .then(res => {
console.log(res.toString()) }) .catch(err => {
console.log(err) })

Generator

yield会给函数的执行添加一个“断点”,只有调用next()才能继续运行。

function* fn() {
yield console.log(1) yield console.log(2) console.log(3)}const fn1 = fn()fn1.next()fn1.next()fn1.next()

async & await

其实和Promise,Generator都有很大的联系,这里利用一个node做一个接口,然后看一下如何利用async和await处理axios请求。

  • node
const express = require('express')const app = express()app.use(require('cors')())app.get('/', (req, res) => {
res.json({
status: 200, message: 'ok' })})app.listen(3000, () => {
console.log("Running")})
  • axios
(async function () {
const res = await axios.get('http://127.0.0.1:3000') console.log(res.data) })()
  • 结果
{
"status": 200, "message": "ok"}

在我的理解中,async中的await会把函数执行停在此处,只有在异步任务完成之后,才会继续进行。

当然不是真正的停止,不然js也太笨了,只是说表现。
想要验证这个表现很简单,把 await 去掉,输出的结果就变为undefined。因为console.log()是同步任务,但是axios.get()为异步任务,根据js的执行机制,肯定会先输出。输出的数据还没有请求过来呢,当然就是undefined了。

转载地址:http://zeozi.baihongyu.com/

你可能感兴趣的文章
模态对话框的销毁过程与非模态对话的几种销毁方法
查看>>
C++实现http下载 && 24点计算编码风格
查看>>
memcached了解使用和常用命令详解
查看>>
GDB调试各功能总结
查看>>
"undefined reference to" 多种可能出现的问题解决方法
查看>>
类结构定义
查看>>
Windows下关于多线程类 CSemaphore,CMutex,CCriticalSection,CEvent,信号量CSemaphore的使用介绍
查看>>
图像处理基本算法(汇总)以及实现
查看>>
C++编程获取本机网卡信息 本机IP 包括Windows和Linux
查看>>
23种设计模式详解及C++实现
查看>>
C++连接CTP接口实现简单量化交易
查看>>
服务端使用c++实现websocket协议解析及通信
查看>>
C# string.Format使用说明
查看>>
Linux下安装Mysql数据库开发环境
查看>>
Linux用户及用户组添加和删除操作
查看>>
通用 Makefile 的编写方法以及多目录 makefile 写法
查看>>
C++的4种智能指针剖析使用
查看>>
RPC框架实现之容灾策略
查看>>
Docker私库
查看>>
hdu——1106排序(重定向)
查看>>