前言

本篇博文出至于我的github仓库:web-study,如果你觉得对你有帮助欢迎star,你们的点赞是我持续更新的动力,谢谢!

异步编程在前端开发中尤为常见,从最早的XHR,到后来的各种封装ajax,再到DOM事件触发的回调,无不涉及异步编程。今天咱们来聊聊ES6中新提出的异步解决方案:Promiseasync/await

  • Promise的原理和基本用法
  1. Promise的原理

Promise 是一种对异步操作的封装,可以通过独立的接口添加在异步操作执行成功、失败时执行的方法。主流的规范是 Promises/A+。

Promise中有几个状态:

  * pending: 初始状态, 非 fulfilled 或 rejected;

  * fulfilled: 成功的操作,为表述方便,fulfilled 使用 resolved 代替;

  * rejected: 失败的操作。

pending可以转化为fulfilled或rejected并且只能转化一次,也就是说如果pending转化到fulfilled状态,那么就不能再转化到rejected。并且fulfilled和rejected状态只能由pending转化而来,两者之间不能互相转换。

  1. Promise的基本用法

Promise是一个构造函数,自己身上有all、reject、resolve这几个眼熟的方法,原型上有then、catch等同样很眼熟的方法。

  • resolve的用法

    var p = new Promise(function(resolve, reject){
    //做一些异步操作
    setTimeout(function(){
    resolve('随便什么数据');
    }, 2000);
    })
    p.then(res => {
    console.log(res) // '随便什么数据'
    })

Promise的构造函数接收一个参数,是函数,并且传入两个参数:resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数。其实这里用“成功”和“失败”来描述并不准确,按照标准来讲,resolve是将Promise的状态置为fullfiled,reject是将Promise的状态置为rejected。

在上面的代码中,我们执行了一个异步操作,也就是setTimeout,2秒后,并且调用resolve方法,表示异步操作执行成功。

  • reject的用法
    var p = new Promise(function(resolve, reject){
//做一些异步操作
setTimeout(function(){
reject('随便什么数据');
}, 2000);
})
p.catch(err => {
console.log(err) // '随便什么数据'
})
``` 上面我们在异步操作中调用了`reject`方法,也就是说把Promise的状态由`pending`转换到了`fulfilled`状态,最后可以通过Promise实例对象的`catch()`方法获取异步数据。 * Async/Await简介与用法 异步操作是 JavaScript 编程的麻烦事,很多人认为async函数是异步操作的终极解决方案。 1. Async/Await简介 * async/await是写异步代码的新方式,优于回调函数和Promise。 * async/await是基于Promise实现的,它不能用于普通的回调函数。 * async/await与Promise一样,是非阻塞的。 * async/await使得异步代码看起来像同步代码,再也没有回调函数。但是改变不了JS单线程、异步的本质。 2. Async/Await的用法 * 使用await,函数必须用async标识 * await后面跟的是一个Promise实例或者是其他的任意js表达式(意义不大) ```javascript var fun = async () => {
let result = await Promise.resolve(123)
console.log(result)
}
fun() // 123

await等待的虽然是promise对象,但是不用调用.then()方法就能直接得到返回值。

  1. Async/Await的应用

Promise虽然一方面解决了callback的回调地狱,但是相对的把回调“纵向发展”了,形成了一个回调链。example:

function sleep(wait) {
return new Promise((res,rej) => {
setTimeout(() => {
res(wait)
},wait)
})
} /*
let p1 = sleep(100)
let p2 = sleep(200)
let p =*/ sleep(100).then(result => {
return sleep(result + 100)
}).then(result02 => {
return sleep(result02 + 100)
}).then(result03 => {
console.log(result03)
})

控制台输出:

300

后面的结果都是依赖前面的结果。

改成async/await写法就是:

async function demo() {
let result01 = await sleep(100)
//上一个await执行之后才会执行下一句
let result02 = await sleep(result01 + 100)
let result03 = await sleep(result02 + 100)
// console.log(result03);
return result03
} demo().then(result => {
console.log(result)
})

因为async返回的也是promise对象,所以用then接受就行了。

结果:

300

需要注意的就是 await是强制把异步变成了同步,这一句代码执行完,才会执行下一句。

简单聊聊ES6-Promise和Async的更多相关文章

  1. Promise、async、await在Egret的简单应用

    Egret Engnie 5.1.10 Egret Wing 4.1.5 一.Promise.async.await相关知识 Promise介绍 阮一峰 async函数 阮一峰 具体和详细的说明用法可 ...

  2. Promise,Async,await简介

    Promise 对象 转载:http://wiki.jikexueyuan.com/project/es6/promise.html 基本用法 ES6 原生提供了 Promise 对象.所谓 Prom ...

  3. Promise, Generator, async/await的渐进理解

    作为前端开发者的伙伴们,肯定对Promise,Generator,async/await非常熟悉不过了.Promise绝对是烂记于心,而async/await却让使大伙们感觉到爽(原来异步可以这么简单 ...

  4. Promise及Async/Await

      一.为什么有Async/Await? 我们都知道已经有了Promise的解决方案了,为什么还要ES7提出新的Async/Await标准呢? 答案其实也显而易见:Promise虽然跳出了异步嵌套的怪 ...

  5. ES6 Promise(2)

    Promise的兴起,是因为异步方法调用中,往往会出现回调函数一环扣一环的情况.这种情况导致了回调金字塔的出现.不仅代码写起来费劲不美观,而且问题复杂的时候,阅读代码的人也难以理解. db.save( ...

  6. 异步Promise及Async/Await最完整入门攻略

    一.为什么有Async/Await? 我们都知道已经有了Promise的解决方案了,为什么还要ES7提出新的Async/Await标准呢? 答案其实也显而易见:Promise虽然跳出了异步嵌套的怪圈, ...

  7. promise 进阶 —— async / await 结合 bluebird

    一.背景 1.Node.js 异步控制 在之前写的 callback vs async.js vs promise vs async / await 里,我介绍了 ES6 的 promise 和 ES ...

  8. 异步Promise及Async/Await可能最完整入门攻略

    此文只介绍Async/Await与Promise基础知识与实际用到注意的问题,将通过很多代码实例进行说明,两个实例代码是setDelay和setDelaySecond. tips:本文系原创转自我的博 ...

  9. 通过 ES6 Promise 和 jQuery Deferred 的异同学习 Promise

    Deferred 和 Promise ES6 和 jQuery 都有 Deffered 和 Promise,但是略有不同.不过它们的作用可以简单的用两句话来描述 Deffered 触发 resolve ...

随机推荐

  1. Java中的反射机制,利用反射访问私有

    利用反射,首先是Class对象的获取,之后是Method和Field对象的获取. 以Method为例,从文档中可以看到: getMethod()方法返回的是public的Method对象, 而getD ...

  2. 关于android 使用bitmap的OOM心得和解决方式

    android开发,从2010年開始学习到如今的独立完毕一个app,这漫长的四年,已经经历了非常多次bug的折磨.无数次的加班训练.然而,自以为自己已经比較了解android了,却近期在一个项目上.由 ...

  3. 天津政府应急系统之GIS一张图(arcgis api for flex)解说(二)鹰眼模块

    解说GIS功能模块实现之前,先大概说一下flexviewer的核心配置文件config.xml,系统额GIS功能widget菜单布局.系统的样式.地图资源等等都是在这里配置的,这里对flexviewe ...

  4. App反编译二次打包常见问题处理

    1.二次打包时报错:Error retrieving parent for item: No resource found that matches the given name 如: D:\用户文件 ...

  5. 【转载】.NET Remoting学习笔记(一)概念

    目录 .NET Remoting学习笔记(一)概念 .NET Remoting学习笔记(二)激活方式 .NET Remoting学习笔记(三)信道 背景 自接触编程以来,一直听过这个名词Remotin ...

  6. WPF窗口最大化

    做C/S应用程序的过程中,要实现的一个功能是可以编辑系统某一类表,这些表又含有不同的properties,properties数量也不相同,有二十来个的,也有一两个的,所以,popUp出来之后大小各异 ...

  7. 诊断并解决 ORA-4030 错误 (Doc ID 1548826.1)

    适用于: Oracle Database - Enterprise Edition - 版本号 8.1.7.4 和更高版本号 本文档所含信息适用于全部平台 用途 怎样诊断 ORA-4030 错误 排错 ...

  8. Kafka知识点汇总

    整体结构 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZXJpY19zdW5haA==/font/5a6L5L2T/fontsize/400/fill/I ...

  9. Shell hook

    [目的]实现 ll -as   +hook+     clear Shell脚本及钩子 - CSDN博客 https://blog.csdn.net/shengzhu1/article/details ...

  10. Spring Boot 整合Servlet

    冷知识,几乎用不到 在spring boot中使用Servlet有两种实现方法: 方法一: 正常创建servlet,然后只用注解@ServletComponentScan package clc.us ...