Promise/async、await帮我们解决了什么

它给我们提供了一种新的异步编程解决方案,同时避免了困扰已久的回调地狱

  1. // 异步的处理可能会产生这样的回调地狱(第二个异步操作和第一个异步的结果有关系)
  2. let Ajax = function(data, success, error){
  3. $.ajax({
  4. data: data,
  5. success: function(res){
  6. success(res)
  7. },
  8. error: function(err){
  9. error(err)
  10. }
  11. })
  12. }
  13. Ajax(data,function(res){
  14. Ajax(data,function(res){
  15. // 继续循环回调
  16. },function(err){})
  17. },function(err){})
  18. // 看看promise的处理方式
  19. let promise = function (data) {
  20. return new Promise((resolve,reject) => {
  21. $.ajax({
  22. data: data,
  23. success: function(res){
  24. resolve(res)
  25. },
  26. error: function(err){
  27. reject(err)
  28. }
  29. })
  30. })
  31. }
  32. let data = {} // ajax请求参数
  33. promise(data).then((res) => {return promise(res)}).catch(err => console.log(err)).then(res => console.log(res))
  34. // async 、await的处理方式使得异步操作更方便
  35. (async function(){
  36. let res = await promise(data)
  37. let resp = await promise(res)
  38. console.log(resp)
  39. })()

Promise的方法总结

Promise.prototype.then()

Promise.prototype.catch()

Promise.prototype.finally()

Promise.all()

  1. # 当存在多个没有相关性的异步操作时想一次性得到所有结果,可以使用promise.all()
  2. Promise.all([p1,p2,p3])
  3. 只有当所有异步操作状态变为resolve的时候
  4. 返回所有值得数组
  5. 当有一个返回reject的时候
  6. 返回值为第一个reject的值

Promise.race()

  1. # 当存在多个没有相关性的异步操作时,想要获得返回速度最快的异步操作采用
  2. Promise.race([p1,p2,p3])
  3. 该方法返回第一个有返回值的异步操作的返回值(resolve或者reject
  4. Promise.race([new Promise((resolve, reject) => {
  5. console.log('init p1')
  6. setTimeout(()=>{
  7. console.log('init p1 +')
  8. resolve('p1')
  9. },2000)
  10. }),new Promise((resolve, reject) => {
  11. console.log('init p2')
  12. setTimeout(()=>{
  13. console.log('init p2 +')
  14. resolve('p2')
  15. },1000)
  16. })]).then(res=>{console.log(res)})
  17. 使用场景:设定一个请求的超时时间
  18. Promise.race([new Promise((resolve,reject)=>{
  19. setTimeout(()=>{
  20. resolve('1')
  21. },2000)
  22. }),new Promise((resolve,reject)=>{
  23. setTimeout(()=>{
  24. reject(new Error('time out'))
  25. },1000)
  26. })]).then((res=>console.log(res)))

Promise.resolve()

  1. Promise.resolve('111').then(res=>console.log(res))

Promise.reject()

  1. Promise.reject('err').catch(res=>console.log(res))

Promise.try()[目前只是一个提案]

  1. # 【使用时机】对于一个方法如果不知道是同步异步方法,但是想要用then来做后续操作,同时希望同步方法同步执行,异步方法异步执行。
  2. # 等价方案
  3. (async () => f())()
  4. .then(res=>console.log(res))
  5. .catch(err=>console.log(err))

async需要注意什么

错误的捕获

  1. const f = () => console.log('now')
  2. (async () => f())()
  3. # async 会吃掉f()的错误,可以通过promise.catch()来捕获
  4. (async () => f())()
  5. .then(res=>console.log(res))
  6. .catch(err=>console.log(err))

参考

Promise
async/await

promise以及async、await学习总结的更多相关文章

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

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

  2. Async/Await 学习与示例

    参考:Async/await学习 es 7 提供了对 promise 对象的更好的操作,省去了很多丧心病狂的链式异步请求,promise 是回调地狱的福音,而 Async/Await 则是 promi ...

  3. Promise及Async/Await

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

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

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

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

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

  6. C# async await 学习笔记2

    C# async await 学习笔记1(http://www.cnblogs.com/siso/p/3691059.html) 提到了ThreadId是一样的,突然想到在WinForm中,非UI线程 ...

  7. node.js异步控制流程 回调,事件,promise和async/await

    写这个问题是因为最近看到一些初学者用回调用的不亦乐乎,最后代码左调来又调去很不直观. 首先上结论:推荐使用async/await或者co/yield,其次是promise,再次是事件,回调不要使用. ...

  8. 异步操作之 Promise 和 Async await 用法进阶

    ES6 提供的 Promise 方法和 ES7 提供的 Async/Await 语法糖都可以更好解决多层回调问题, 详细用法可参考:https://www.cnblogs.com/cckui/p/99 ...

  9. callback vs async.js vs promise vs async / await

    需求: A.依次读取 A|B|C 三个文件,如果有失败,则立即终止. B.同时读取 A|B|C 三个文件,如果有失败,则立即终止. 一.callback 需求A: let read = functio ...

  10. Callback, Promise和Async/Await的对比

    Callback, Promise和Async/Await的对比 Callback Hell getData1(function (data1) { console.log('我得到data1了') ...

随机推荐

  1. mysql多对多查询 原生写法

    准备工作,1.创建表 CREATE TABLE IF NOT EXISTS `users` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `name` VARCHAR ...

  2. vue-router路由如何实现传参

    tip: 用params传参,F5强制刷新参数会被清空,用query,由于参数适用路径传参的所以F5强制刷新也不会被清空.(传参强烈建议适用string) 也可以选用sessionstorage/lo ...

  3. SSM003/构建Maven单模块项目(二)

    一.Controller基础代码(mooc) 1.UserController.java /** *springmvc1-2:返回jsp页面 * 请求URL: /user/getUserById?us ...

  4. MYSQL的ACID

    原子性 (Atomicity) 原子性是指一个事务是一个不可分割的工作单位,其中的操作要么都做,要么都不做. 隔离性 (Isolation) 隔离性是指多个事务并发执行的时候,事务内部的操作与其他事务 ...

  5. STL 仿函数(函数对象)

    ##定义 仿函数(functor):一种具有函数性质的对象. 仿函数在C++中的新名称为函数对象(function object). 仿函数类对象像函数一样被调用,调用仿函数类对象时,实际调用的是仿函 ...

  6. Docker 容器化部署1小时简单入门

    Docker简介 Docker是DotCloud开源的.可以将任何应用包装在Linux container中运行的工具.2013年3月发布首个版本,当前最新版本为1.3.Docker基于Go语言开发, ...

  7. MySql-8.0.16版本部分安装问题修正

    本帖参考网站<https://blog.csdn.net/lx318/article/details/82686925>的安装步骤,并对8.0.16版本的部分安装问题进行修正 在MySQL ...

  8. 什么是 Python?

     Python 是一种编程语言,它有对象.模块.线程.异常处理和自动内存管理,可以加入其他语言的对比.  Python 是一种解释型语言,Python 在代码运行之前不需要解释.  Python 是动 ...

  9. Python 中的 os 模块常见方法?

    os.remove() 删除文件 os.rename() 重命名文件 os.walk() 生成目录树下的所有文件名 os.chdir() 改变目录 os.mkdir/makedirs 创建目录/多层目 ...

  10. 【数据库运维】数据库(server)的时区设置及世界主要地区的时区

    [时区设置不当会有什么问题] 当进行海外项目运维的时候,常常会遇到时区设置的问题.假设时区设置不当 或者 同样项目的server之间的时区不一致,都会有导致项目的数据异常的风险. 假设数据表的字段使用 ...