1. 回调函数

  优点: 解决了同步的问题(只要有一个任务耗时长后面的任务都会等待,会拖延程序执行)

  缺点: 回调地狱  不能用try  catch捕获  不能用 return

setTimeout(() => {
// callback 函数体
}, 1000)

  

2. promise

  优点: 解决了回调地狱问题

  缺点: 无法取消promise  错误需要通过回调函数捕获

ajax('XXX1', () => {
  // callback 函数体
  ajax('XXX2', () => {
    // callback 函数体
    ajax('XXX3', () => {
      // callback 函数体
    })
  })
})

ajax('XXX1')
  .then(res => {
    // 操作逻辑
    return ajax('XXX2')
  }).then(res => {
  // 操作逻辑
  return ajax('XXX3')
  }).then(res => {
  // 操作逻辑
})

  

3.Generator

  缺点:如果不适用执行器的情况可能阅读性会很差

  特点:可以控制函数的执行,可以配合co函数库使用

function *fetch() {
yield ajax('XXX1', () => {})
yield ajax('XXX2', () => {})
yield ajax('XXX3', () => {})
}
let it = fetch()
let result1 = it.next()
let result2 = it.next()
let result3 = it.next()

4. async/await

  优点: 代码清晰,不像promise一大堆   .then

  缺点:await将异步代码改造为同步代码,如果多个异步操作没有依赖性而使用await 会导致性能降低

async function test() {
// 以下代码没有依赖性的话,完全可以使用 Promise.all 的方式
await fetch('XXX1')
await fetch('XXX2')
await fetch('XXX3')
}

JS异步解决方案及优缺点的更多相关文章

  1. JS异步解决方案

    前言 异步最早的解决方案是回调函数,如ajax,事件的回调,setInterval/setTimeout中的回调.但是回调函数有回调地狱的问题; 为了解决回调地狱的问题,社区提出了Promise解决方 ...

  2. JS异步解决方案之概念理解-----------阻塞和非阻塞,同步和异步,并发和并行,单线程和多线程

    首先记住一句话,JS是单线程的. 单线程意味着什么?单线程意味着 它不能依靠自己实现异步. JS实现的异步,往往都是靠 浏览器.Node 的机制(事件驱动.回调)实现的. 下面让我这个单身狗 以谈恋爱 ...

  3. node.js异步编程解决方案之Promise用法

    node.js异步编程解决方案之Promise var dbBase = require('../db/db_base'); var school_info_db = require('../db/s ...

  4. js async await 终极异步解决方案

    既然有了promise 为什么还要有async await ? 当然是promise 也不是完美的异步解决方案,而 async await 的写法看起来更加简单且容易理解. 回顾 Promise Pr ...

  5. 关于使用Iscroll.js异步加载数据后不能滑动到最底端的问题解决方案

    关于使用Iscroll.js异步加载数据后不能滑动到最底端,拉到最下边又弹回去的问题困扰了我老半天,相信很多朋友都遇到了.我刚好不小心解决了,和大家分享一下.由于各种忙,下边就直接上代码吧. (前提是 ...

  6. [转] js async await 终极异步解决方案

    阅读目录 回顾 Promise async await 字面理解 async.await 如何执行 await 操作符 总结 既然有了promise 为什么还要有async await ? 当然是pr ...

  7. js异步编程

    前言 以一个煮饭的例子开始,例如有三件事,A是买菜.B是买肉.C是洗米,最终的结果是为了煮一餐饭.为了最后一餐饭,可以三件事一起做,也可以轮流做,也可能C需要最后做(等A.B做完),这三件事是相关的, ...

  8. 关于JS异步加载方案

    javascript延迟加载的解决方案: 1.使用defer标签 <span style="font-size: small;"><script type=&qu ...

  9. js 异步流程控制之 avQ(avril.queue)

    废话前言 写了多年的js,遇到过最蛋疼的事情莫过于callback hell, 相信大家也感同身受. 业界许多大大也为此提出了很多不错的解决方案,我所了解的主要有: 朴灵 event proxy, 简 ...

  10. 前端分享----JS异步编程+ES6箭头函数

    前端分享----JS异步编程+ES6箭头函数 ##概述Javascript语言的执行环境是"单线程"(single thread).所谓"单线程",就是指一次只 ...

随机推荐

  1. 传参base64时的+号变空格问题

    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,非公众号转载保留此声明. 问题发生 上上周,看到一位老哥找我们组同事联调接口,不知道是什么问题,两人坐一起搞了快1个小时,看起来好像有点复 ...

  2. 创建镜像发布到镜像仓库【不依赖docker环境】

    image 工具背景 如今,docker镜像常用于工具的分发,demo的演示,第一步就是得创建docker镜像.一般入门都会安装docker,然后用dockerFile来创建镜像,除此以外你还想过有更 ...

  3. 常用Linux系统命令、vim编辑命令汇总(看一遍用时候来查)

    基本操作 pwd命令 作用:显示当前工作目录 用法:pwd cd命令 作用:改变目录位置 用法:cd [option] [dir] cd 目录路径 -进入指定目录 cd .. -返回父目录 cd / ...

  4. 有了HTTP,为啥还要用RPC

    既然有 HTTP 请求,为什么还要用 RPC 调用? 一直以来都没有深究过RPC和HTTP的区别,不都是写一个服务然后在客户端调用么? HTTP和RPC最本质的区别,就是 RPC 主要是基于 TCP/ ...

  5. QT实现可拖动自定义控件

    使用QT实现自定义类卡牌控件Card,使其能在父类窗口上使用鼠标进行拖动. 控件类头文件card.h #ifndef CARD_H #define CARD_H #include <QWidge ...

  6. python入门教程之十八正则表达式

    re.match函数 re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none. 函数语法: re.match(pattern, string, ...

  7. [大数据]Hadoop常用命令合集

    hadoop 查看hadoop版本 # hadoop version SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found ...

  8. [数据库]mysql/mysqldump命令帮助说明

    1 mysql [root@test ~]# mysql --help mysql Ver 14.14 Distrib 5.7.24-27, for Linux (x86_64) using 6.0 ...

  9. [Linux]Xshell连接Centos7能Ping通但无法连接问题[ssh(d)+firewalld/iptables+chkconfig]

    一 方案与思路 0 xshell客户端监测是否能够ping通目标服务器. 前提:知晓目标服务器IP地址 Linux: ifconfig -a Windows: ipconfig -a 1 利用fire ...

  10. 对dubbo的DubboReference.check的参数进行剖析

    背景 在使用dubbo的时候,发现当消费者启动的时候,如果提供者没有启动,即使提供者后来启动了,消费者也调不通提供者提供的接口了. 注册中心使用都是nacos dubbo版本是3.0.4 例子 接口 ...