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 封装的,那么要了解这些库的前置条件得先熟悉 ...
随机推荐
- js匿名函数自执行的好处
我们知道,在创建一个函数时如果要用到变量来存取信息的话,要尽量使用局部变量. 因为一方面局部变量会随着函数的执行结束被销毁:另一方面在不执行函数的时候也不会创建这个局部变量,对节省空间资源有很大的好处 ...
- JDK1.7中HashMap死环问题及JDK1.8中对HashMap的优化源码详解
一.JDK1.7中HashMap扩容死锁问题 我们首先来看一下JDK1.7中put方法的源码 我们打开addEntry方法如下,它会判断数组当前容量是否已经超过的阈值,例如假设当前的数组容量是16,加 ...
- Warfare And Logistics UVA - 1416
题目链接:https://vjudge.net/problem/UVA-1416 题解: 这是一个最短路的好题,首先我们考虑如果暴力弗洛伊德,显然时间复杂度不对,如果做n次spfa好像复杂度也不对,所 ...
- Faker——生成测试数据的PHP类库
工作上用的是TP框架,每次测试功能的时候都要手动添加测试数据,词穷起名总是起一些test1.test2这种low到爆炸的用户名,这让我很难受.稍微翻阅了一些资料,发现laravel有一个生成测试数据的 ...
- Focus on the Good 专注于好的方面
[1] Dealing with people is like digging for gold. When you go digging for an ounce of gold, you hav ...
- Debian更新源加安装Metespolit&&Cobalt Strike
首先更新下源 修改/etc/apt/sources.list文件 再apt-get update deb http://mirrors..com/debian/ stretch main non-fr ...
- ubuntu 虚拟机设置静态ip
$ sudo vim /etc/network/interfaces auto ens33 # 使用的网络接口,之前查询接口是为了这里 iface ens33 inet static ...
- vue element NavMenu 莫名出现蓝色边框
最近在开发一款官网,使用的是element,在头菜单NavMenu,的时候没有设置任何的边框属性,结果出现了如下图所示的边框线. 点击有二级菜单时出现 找了好多方法发现是有一个属性影响到了,:focu ...
- Shiro 并发登录控制
本文转载于:https://www.w3cschool.cn/shiro/epht1ifg.html
- 在Mac平台用Sublime编辑器使用Git并连接github
近期闲来无事,学习一下Git版本控制的东西,首先是要在我的pc上学会如何向git上提交我的代码,记录一下过程以及遇到的问题. 一.Mac下Sublime Text 3整合Git 来源于一个技术教程:h ...