Promise 和async/await 的使用理解

1. new Promise时就会开始执行语句。
  new Promise(resolve => resolove('成功信息') )     简写:Promise.resolve('成功信息');
  new Promise((resolve,reject) => reject('错误信息') ) 简写:Promise.reject('错误信息');
 
2. new Promise中的return data语句没啥用,而要使用resolve或reject
 
3. new Promise中resolve或reject前后的代码都会先执行
 
4. Promise中必须使用resolve和reject 这样then方法才会执行,否则不执行。
   

promise.then(function(value) {
// 对应resolve的值
}, function(error) {
// 对应异常或者reject的值
});
let p1 = new Promise((resolve, reject) => {
//做一些异步操作
setTimeout(() => {
console.log('p1 - 执行完成');
//reject('我是失败');
resolve('我是成功!!');//必须使用resolve,不然后面不会执行
console.log('p1 - 执行完成2'); }, 2000);
}); let p2 = new Promise((resolve, reject) => {
//做一些异步操作
setTimeout(() => {
console.log('执行完成2');
resolve('我是成功2!!');
//return '我是成功!!';
}, 2000);
}); p1.then((data) => {
console.log("1-"+data);
return p2.then((data1) =>{
console.log("p2 -1-"+data1);
return "数据p2";
}) })
.then((data) => {
console.log("2-"+data);
return data;
})
.then((data) => {
console.log("3-"+data);
},(err) => {
console.log('3-rejected',err);
}).catch((err) => {
console.log('finally -rejected',err);
});
5. then中,要返回数据要使用return ;否则后面的then接收到的数据是undefined
  then中,return data返回的数据会包装成Promise.resolve(data)继续调用then,后面的then能接收到data
       如果没有return语句,那么默认是一个空的Promise.resolve(undefined),后面的then参数接收到的数据为undefined
  then中,return new Promise(),那么会等这个Promise调用完再执行then,即链式调用。
  then中,new Promise() 前没有return会异步执行,会立即执行后面的then,而不会等这个Promise执行完。
 
6. 异常处理,then中的第二个参数是接收错误的,会一步步通过then传下去,也可以用catch接收。
 
7. Promise.all用法:并行异步执行,所有都执行完
 
let Promise1 = new Promise(function(resolve, reject){})
let Promise2 = new Promise(function(resolve, reject){})
let Promise3 = new Promise(function(resolve, reject){}) let p = Promise.all([Promise1, Promise2, Promise3]) p.then(funciton(){
// 三个都成功则成功
}, function(){
// 只要有失败,则失败
})

8. Promise.race的用法:谁跑的快,以谁为准执行回调

  //请求某个图片资源
function requestImg(){
var p = new Promise((resolve, reject) => {
var img = new Image();
img.onload = function(){
resolve(img);
}
img.src = '图片的路径';
});
return p;
}
//延时函数,用于给请求计时
function timeout(){
var p = new Promise((resolve, reject) => {
setTimeout(() => {
reject('图片请求超时');
}, 5000);
});
return p;
}
Promise.race([requestImg(), timeout()]).then((data) =>{
console.log(data);
}).catch((err) => {
console.log(err);
});

9. async/await 简化Promise编码

     

  • async/await是写异步代码的新方式,优于回调函数和Promise。
  • async返回值是一个promise对象,async 函数内部return语句返回的值,会成为then方法调用函数的参数
  • await命令后面跟着的是一个promise对象,如果不是会自动转化为promise对象
  • await 关键字必须位于async函数内部
  • async/await是基于Promise实现的,它不能用于普通的回调函数。
  • async/await与Promise一样,是非阻塞的。
  • async/await使得异步代码看起来像同步代码,再也没有回调函数。但是改变不了JS单线程、异步的本质。
//例子1 -Promise
const makeRequest = () => {
return promise1()
.then(value1 => {
return promise2(value1)
.then(value2 => {
return promise3(value1, value2)
})
})
} //例子1 - 等价的async/await
const makeRequest = async () => {
const value1 = await promise1()
const value2 = await promise2(value1)
return promise3(value1, value2)
}
//例子2 -promise
request("ajaxA")
.then((data)=>{
//处理data
return request("ajaxB")
})
.then((data)=>{
//处理data
return request("ajaxC")
})
.then((data)=>{
//处理data
return request("ajaxD")
}) //例子2-等价的async/await
async function load(){
await request("ajaxA");
await request("ajaxB");
await request("ajaxC");
await request("ajaxD");
}

  

Promise 和async/await 的使用理解的更多相关文章

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

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

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

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

  3. Promise及Async/Await

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

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

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

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

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

  6. “setTimeout、Promise、Async/Await 的区别”题目解析和扩展

    解答这个题目之前,先回顾下JavaScript的事件循环(Event Loop). JavaScript的事件循环 事件循环(Event Loop):同步和异步任务分别进入不同的执行"场所& ...

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

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

  8. js中回调函数,promise 以及 async/await 的对比用法 对比!!!

    在编程项目中,我们常需要用到回调的做法来实现部分功能,那么在js中我们有哪些方法来实现回调的? 方法1:回调函数 首先要定义这个函数,然后才能利用回调函数来调用! login: function (f ...

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

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

随机推荐

  1. 如何部署redis服务

    使用工具 redis-64-3.2.100 部署系统 windows server 2012R2 1.下载安装redis-64-3.2.100安装包,下载地址:https://github.com/m ...

  2. python小题目汇总

    1.编程计算两个日期之间的天数与周数 Python时间处理---dateutil模块: dateutil模块主要有两个函数,parser和rrule. 其中parser是根据字符串解析成datetim ...

  3. 11-19 hashlib模块

    Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢? 摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进 ...

  4. 记一次TOMCAT一段时间自动关闭

    最近同事开发的一个项目部署上线后用过几天就TOMCAT自动关闭,并且该项目没有开通对外访问.通过阿里云监控台查看,从升级后系统内存占用上升趋势,CPU等信息没有太大变化. 打印服务器日志后发现全是线程 ...

  5. Hotspot GC研发工程师也许漏掉了一块逻辑

    本文来自: PerfMa技术社区 PerfMa(笨马网络)官网 概述 今天要说的这个问题,是我经常面试问的一个问题,只是和我之前排查过的场景有些区别,属于另外一种情况.也许我这里讲了这个之后,会成为不 ...

  6. 牛!Python 也能实现图像姿态识别溺水行为了!

    作者 | 李秋键 责编 | Carol 封图 | CSDN 下载自视觉中国 众所周知随着人工智能智能的发展,人工智能的落地项目也在变得越来越多,尤其是计算机视觉方面. 很多人学习python,不知道从 ...

  7. zuul路由网关集成ssl,实现http到https的转变

    1 前言 最近几天刚开始接触微信小程序的开发,才接触到了https的概念(微信小程序中的请求必须为https请求,不然请求无法成功).https算是对http的安全封装,在http的基础上加了ssl证 ...

  8. 为何选择spark!

    随着大数据处理的应用场景越来越多,人们对Hadoop的要求也越来越高,开发出的对应的系统也越来越多,人们迫切的需要一个综合的计算框架,Spark应运而生,我们可以看看Spark可以干些什么. 那么为什 ...

  9. java_String类、StringBuilder类、Arrays类、Math类的使用

    String类 java.lang.String 类代表字符串.Java程序中所有的字符串文字(例如 “abc” )都可以被看作是实现此类的实例 构造方法 java.lang.String :此类不需 ...

  10. 源码剖析Springboot自定义异常

    博主看到新服务是封装的自定义异常,准备入手剖析一下,自定义的异常是如何进行抓住我们请求的方法的异常,并进行封装返回到.废话不多说,先看看如何才能实现封装异常,先来一个示例: @ControllerAd ...