generator和promise配合解决js异步地狱问题
为何要使用generator函数和promise?
- js的异步地狱一直是困扰前端程序员的一个头疼的问题
比如说我要获取还有列表,一般来说会使用ajax来获取
$.ajax(...等等,function(res){
// res代表获取的本人信息
$.ajax(....等等,function(res){
//在本人信息的基础之上获取我的好友名字
$.ajax(....等等,function(res){
//根据我的好友名字获取我的好友的基本信息等等...
})
})
})
- 从上面的代码可以看出来,异步虽然是一个很好的方式,但是过多的嵌套会带来很严重的问题,并且性能不是很高
第一版本解决方式
- 使用promise和await/async配合
function getTime(){
return new Promise((resolve,reject){
setTimeout(()=>{
resolve('这是一秒之后')
},1000)
})
}
第二版本解决方式
- 配合await/async使用
async function test(){
//在这里面就可以像同步代码一样书写异步函数
//并且不会出现js异步地狱的问题
const result = await getTime()
return result;
}
test() //开始执行
- 使用then的方式
getTime().then(res=>{
console.log(res) //会返回resovle的结果
}).catch(error=>{
console.log(error) //打印错误的情况下
})
虽然说这个代码已经很实用,很好看了,但是如果有更好的方式可以解决多个异步函数的问题,让他循环执行,岂不是完美
- 那么就看接下来的
终极版
function* add(num){
const r1 = yield getPromise(num)
yield getPromise(r1)
}
function getPromise(num){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
var count = num * num
console.log(count)
resolve(count)
},1000)
})
}
var r2 = add(2);
r2.next().value.then(res=>{
console.log(r2.next(res))
})
看的出来,没有减少代码甚至增加了代码量
- 主要是由于generator本身并不是一个单独使用的函数,一般会配合很多库来使用
如果用过redux-saga的人一定不会陌生了
分享不易,希望可以留下小星星-
generator和promise配合解决js异步地狱问题的更多相关文章
- promise 的基本概念 和如何解决js中的异步编程问题 对 promis 的 then all ctch 的分析 和 await async 的理解
* promise承诺 * 解决js中异步编程的问题 * * 异步-同步 * 阻塞-无阻塞 * * 同步和异步的区别? 异步;同步 指的是被请求者 解析:被请求者(该事情的处理者)在处理完事情的时候的 ...
- 学习 Promise,掌握未来世界 JS 异步编程基础
其实想写 Promise 的使用已经很长时间了.一个是在实际编码的过程中经常用到,一个是确实有时候小伙伴们在使用时也会遇到一些问题.Promise 也确实是 ES6 中 对于写 JS 的方式,有着真正 ...
- Promise如何解决回调地狱
为什么要有promise:解决(回调地狱)的问题 ### 回调地狱: ```js //跟以前的if条件地狱很像 // if(){ // if(){ // if(){ // } // } //} $.g ...
- js异步编程
前言 以一个煮饭的例子开始,例如有三件事,A是买菜.B是买肉.C是洗米,最终的结果是为了煮一餐饭.为了最后一餐饭,可以三件事一起做,也可以轮流做,也可能C需要最后做(等A.B做完),这三件事是相关的, ...
- 一个例子读懂 JS 异步编程: Callback / Promise / Generator / Async
JS异步编程实践理解 回顾JS异步编程方法的发展,主要有以下几种方式: Callback Promise Generator Async 需求 显示购物车商品列表的页面,用户可以勾选想要删除商品(单选 ...
- JS异步编程 (2) - Promise、Generator、async/await
JS异步编程 (2) - Promise.Generator.async/await 上篇文章我们讲了下JS异步编程的相关知识,比如什么是异步,为什么要使用异步编程以及在浏览器中JS如何实现异步的.最 ...
- 【JavaScript】 使用Async 和 Promise 完美解决回调地狱
很久以前就学习过Async和Promise,但总是一知半解的. 今天在写NodeJS的时候,发现好多第三方库使用回调,这样在实际操作中会出现多重回调,这就是传说中的JS回调地狱. 举个例子 有一个方法 ...
- JS 异步与 Promise
JS 异步与 Promise 本文写于 2020 年 6 月 8 日 1. 同步与异步与回调函数 Promise 现在是前端面试必考题呀,但是先不急着看 Promise,我们首先来看看什么是异步. - ...
- JS 异步系列 —— Promise 札记
Promise 研究 Promise 的动机大体有以下几点: 对其 api 的不熟悉以及对实现机制的好奇; 很多库(比如 fetch)是基于 Promise 封装的,那么要了解这些库的前置条件得先熟悉 ...
随机推荐
- SparkStreaming整合Flume的pull报错解决方案
先说下版本情况: Spark 2.4.3 Scala 2.11.12 Flume-1.6.0 Flume配置文件: simple-agent.sources = netcat-source simpl ...
- 推荐一款超好用的工具cmder
今天来推荐一个超级好用的命令行工具:cmder 一款Windows环境下非常简洁美观易用的cmd替代者,它支持了大部分的Linux命令.支持ssh连接linux,使用起来非常方便.比起cmd.powe ...
- [JZOJ5185] 【NOIP2017提高组模拟6.30】tty's sequence
Description
- opencv::SURF特征
SURF特征基本介绍 SURF(Speeded Up Robust Features)特征关键特性: -特征检测 -尺度空间 -选择不变性 -特征向量 工作原理 . 选择图像中POI(Points o ...
- opencv::模板匹配(Template Match)
模板匹配介绍 模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域. 所以模板匹配首先需要一个模板图像T(给定的子图像) 另外需要一个待检测的图像-源图像S 工作方法,在带检测图像上,从左到右,从 ...
- opencv::模糊图像
Smooth/Blur 是图像处理中最简单和常用的操作之一,使用该操作的原因之一就为了给图像预处理时候减低噪声 使用Smooth/Blur操作其背后是数学的卷积计算,通常这些卷积算子计算都是线性操作, ...
- i春秋DMZ大型靶场实验(三)内网转发DMZ2
更具实验文件知道存在源码泄露 下载源码进行源码审计 发现admin账号 查看user.php 发现mysql 账号 端口 对登录后源码进行审计 发现上传文件的两处漏洞 对 fiel name 可以 ...
- linux+jenkins+postman持续集成
环境搭建:linux上安装newman,部署好jenkins linux上war包方式安装Jenkins 以下实现jenkins上执行postman测试脚本: 1.新建一个自动风格的job 2.构建- ...
- 玩转PubSubClient MQTT库
1.前言 在ESP8266学习系列中,博主一直使用HTTP协议.HTTP连接属于短连接,而在物联网应用中,广泛应用的却是MQTT协议.所以,本篇我们将学习Arduino平台上的MQTT实现库 ...
- ArcGIS Engine简单图形绘制功能的实现(点、线、面)
我们添加点.线.面来实现图形的编辑需要使用Geometry对象类. Point(点) 是一个0维的几何图形,具有X.Y坐标值,以及可选的属性,如高程值(Z值).度量值(M值).ID值等,可用于描述需要 ...