1.传统异步处理

  • ES6之前使用回调进行处理,示例代码:
//创建一个异步返回 双倍数值 的函数
function asyncDouble(num,cb){
// 创建标识,表示该异步处理是否完成
var complite = false
// 数值处理结果
var result = null var timeOut = Math.random() * 3
console.log('timeOut = ',timeOut) // 模拟异步操作
setTimeout(() => {
// 产生处理结果
result = num * 2
// 切换标识状态为完成
complite = true
},timeOut * 1000) // 创建定时器监听异步处理是否完成
var timer = setInterval(() => {
// 根据标识判断异步处理完成,执行回调并传入处理结果
if(complite){
cb && cb(result)
clearInterval(timer)
}
},100)
} //调用
asyncDouble(5,function(result){
console.log(result) // 10
})

2.Promise处理异步

  • Promise定义:Promise是为了解决ES5中回调地狱而诞生的,Promise,顾名思义,就是承诺以后执行
  • Promise创建:Promise是一个构造函数,构建示例时接收一个异步函数,创建的同时会把传入的函数执行一遍,所以需要把它封装到一个函数内部,直到函数调用时才创建promise,并执行里面的代码
  • 成功与失败:传入的异步函数有2个参数(resolve,reject),成功调用resolve并把结果传递给它,失败则调用reject
//创建一个支持promise的异步方法
<script>
//封装一个支持promise的异步函数
function asyncDoubleForPromise(num){
//创建promise并返回
return new Promise(function(resolve,reject){
// 模拟异步操作
setTimeout(() => {
//判断失败还是成功
if(isNaN(num)){
//失败处理
reject()
}else{
//成功处理
resolve(num*2)
}
},1000)
})
}
</script>
  • 使用then()处理异步结果:resolve对应的是then()的第一个参数,reject对应then()的第二个参数
//成功调用
asyncDoubleForPromise(5).then(res=>{
console.log(res) //10
}) //失败调用
asyncDoubleForPromise('a').then(function(res){
console.log('执行成功')
},function(){
console.log('执行失败') //执行失败
})
  • 使用catch()处理失败
//失败调用
asyncDoubleForPromise('a').then(res=>{
console.log(res)
}).catch(function(){
console.log('执行失败') //执行失败
})

3.Async/await

  • async和await关键字让我们可以用一种更简洁的方式写出基于Promise的异步行为,而无需刻意地链式调用promise。
  • Async/await这两个关键字是成对存在的,只有在用 async 声明的function,其内部才能使用 await
  • await是等待的意思,后面接收一个promise,他会一直等待promise的数据(实参)返回,然后将promise中的数据(实参)提取出来,供后面的代码处理,在此过程中,await后面的代码不会执行,处于等待状态
//实例:用async/await处理ajax请求
async function getGameList(){ //异步操作
try{
console.log('开始请求',new Date().getTime())
//axios是异步方法 await会一直等待其返回结果
const result = await axios.get('/game_list.json')
//直到axios请求结果回来,才会执行后面的代码
console.log('数据已经回来',new Date().getTime())
}catch(err){
console.log(err)
}
}

4.并发

  • 通过Promise.all([promise,promise2])发起并发请求,待所有请求都回来后统一处理
<script>
new Vue({
el:"#app",
data: { },
created(){
//直接读取返回结果
this.getAllData()
},
methods: {
getAllData(){
//接收2个promise对象
Promise.all([this.getData(), this.getData2()])
.then(function(resArr){
//返回结果放入数组中
console.log('res1',resArr[0].data)
console.log('res2',resArr[1].data)
})
},
getData(){
//返回promise对象
return axios.get('http://127.0.0.1:8086/getDouble?val=5')
},
getData2(){
//返回promise对象
return axios.get('http://127.0.0.1:8086/getTriple?val=10')
}
}
})
</script>

Javascript 异步处理的更多相关文章

  1. JavaScript异步编程的主要解决方案—对不起,我和你不在同一个频率上

    众所周知(这也忒夸张了吧?),Javascript通过事件驱动机制,在单线程模型下,以异步的形式来实现非阻塞的IO操作.这种模式使得JavaScript在处理事务时非常高效,但这带来了很多问题,比如异 ...

  2. JavaScript异步编程原理

    众所周知,JavaScript 的执行环境是单线程的,所谓的单线程就是一次只能完成一个任务,其任务的调度方式就是排队,这就和火车站洗手间门口的等待一样,前面的那个人没有搞定,你就只能站在后面排队等着. ...

  3. javascript异步编程的前世今生,从onclick到await/async

    javascript与异步编程 为了避免资源管理等复杂性的问题, javascript被设计为单线程的语言,即使有了html5 worker,也不能直接访问dom. javascript 设计之初是为 ...

  4. JavaScript异步编程(2)- 先驱者:jsDeferred

    JavaScript当前有众多实现异步编程的方式,最为耀眼的就是ECMAScript 6规范中的Promise对象,它来自于CommonJS小组的努力:Promise/A+规范. 研究javascri ...

  5. 【转】JavaScript 异步进化史

    前言 JS 中最基础的异步调用方式是 callback,它将回调函数 callback 传给异步 API,由浏览器或 Node 在异步完成后,通知 JS 引擎调用 callback.对于简单的异步操作 ...

  6. 对Javascript异步执行的理解

    简单的查看了下Javascript异步编程的代码.按照网上的说法,Javascript异步编程的核心就在于setTimeout.这个系统函数让我们将函数的执行放在了一个指定的新“线程”中.于是本来的顺 ...

  7. Promises与Javascript异步编程

    Promises与Javascript异步编程 转载:http://www.zawaliang.com/2013/08/399.html 在如今都追求用户体验的时代,Ajax应用真的是无所不在.加上这 ...

  8. Javascript 异步加载详解

    Javascript 异步加载详解 本文总结一下浏览器在 javascript 的加载方式. 关键词:异步加载(async loading),延迟加载(lazy loading),延迟执行(lazy ...

  9. javascript异步延时载入及推断是否已载入js/css文件

    <html> <head> <script type="text/javascript"> /**======================= ...

  10. Javascript异步请求你能捕获到异常吗?

    Javascript异步请求你能捕获到异常吗? 异常处理是程序发布之前必须要解决的问题,不经过异常处理的应用会让用户对产品失去信心.在异常处理中,我们一贯的做法是按照函数调用的次序,将异常从数据访问层 ...

随机推荐

  1. RxJS 系列 – Custom Operator

    前言 虽然 RxJS 提供了非常多的 Operators. 但依然会有不够用的时候. 这时就可以自定义 Operator 了. Operator Is Just a Function Observab ...

  2. Email 关于 POP3 IMAP SMTP office365 Outlook Gmail G-Suit shared mailbox小小理解

    Outlook 是微软的一个 email 软件, 管理 email 的 UI. Gmail 是 google 的 office365 是一个配套, 里面有 email, one drive, exce ...

  3. 浏览器原生组件 shadow DOM(已完成)

    https://developer.mozilla.org/zh-CN/docs/Web/Web_Components/Using_shadow_DOM Web components 的一个重要属性是 ...

  4. PMP——如何区分赶工与快速跟进?

    如何区分赶工与快速跟进? 在PMP考试中经常出现由于时间不够需要进行进度压缩的场景.进度压缩的常用工具有赶工和快速跟进两种方式.也可以辅助调整某些活动的提前量与滞后量来进行缓解.提前量是相对于紧前活动 ...

  5. [OI] throw

    throw 主要是用来抛出异常. throw 可以直接向主程序 throw 一个东西,可以是各种数据类型,显示在界面上就是抛出的数据类型. int main(){ throw 1; } termina ...

  6. [namespace hdk] 向量 direct_vector

    我忏悔我有罪我心情又不好了不知道干什么所以又不小心封了个东西啊啊啊啊啊啊啊啊 功能 已重载 [] 运算符(左值) 已重载 = 运算符(可使用向量或 std:::vector) 已重载 + += - - ...

  7. iManager微服务(云套件)配置https证书流程步骤

    本文使用的是10.1版本,需要手动去配置证书,未来版本会考虑进行界面化配置. 一.提前准备 1. 证书需要准备三个文件 *.key *.crt *.keystore 2. 需要知道自己创建的微服务是哪 ...

  8. 活动预告 | 中国数据库联盟(ACDU)中国行第三站定档成都,邀您探讨数据库前沿技术

    数据库技术一直是信息时代中不可或缺的核心组成部分,随着信息量的爆炸式增长和数据的多样化,其重要性愈发凸显.作为中国数据库联盟(ACDU)的品牌活动之一,[ACDU 中国行]在线下汇集数据库领域的行业知 ...

  9. .NetCore 目录浏览 和 静态文件

    1.  静态文件 包:microsoft.aspdotnet.staticfiles app.UseStaticFiles()  会默认找到 wwwroot文件夹 // 匹配到指定条件然后执行中间件 ...

  10. js中,什么是数组 , 数组有几种创建方式?

    1. 什么是数组? 数组是可以把一组相关的数据一起存放,并提供方便的访问(存取) 数组是指一组数据的集合,其中每个数据被称作元素(数组单元),数组单元可以是任意类型的数据,数组是一种将一组数据存储在单 ...