Promise简单用法
Promise
Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理且更强大。它最早由社区提出并实现,ES6将其写进了语言标准,统一了用法,并原生提供了Promise对象。
特点
1.对象的状态不受外界影响 (3种状态)
Pending状态(进行中)
Fulfilled状态(已成功)
Rejected状态(已失败)
2.一旦状态改变就不会再变 (两种状态改变:成功或失败)
Pending -> Fulfilled
Pending -> Rejected
用法
创建Promise实例
let promise = new Promise(function(resolve, reject){// 你自己的异步逻辑代码if (/* 异步操作成功 */) {resolve(value);} else { // 异步操作失败reject(error);}
})
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由JavaScript引擎提供,不用自己部署。
resolve作用是将Promise对象状态由“未完成”变为“成功”,也就是Pending -> Fulfilled,在异步操作成功时调用,并将异步操作的结果作为参数传递出去;
而reject函数则是将Promise对象状态由“未完成”变为“失败”,也就是Pending -> Rejected,在异步操作失败时调用,并将异步操作的结果作为参数传递出去。
then
Promise实例生成后,可用then方法指定一种状态回调参数:
1.Promise对象状态改为Resolved时调用 (必选)
备注:通俗的讲 resolve => then
catch
Promise实例生成后,可用catch方法指定一种状态回调参数:
1.Promise对象状态改为Rejected时调用 (可选)
备注:通俗的讲 reject => catch
基本用法示例
function sleep(num) {return new Promise(function(resolve, reject) {if (num>10){resolve('成功') } else {reject('失败') } })
}
sleep(500).then( res=> console.log(res)).catch(err => console.log(err));
这段代码定义了一个函数sleep,调用后,如果传入的实参大于10,你会发现他会触发then的回调函数,并且打印出成功,如果传入的实参小于10,你会发现他会触发catch的回调函数,并且打印出失败。
执行顺序
接下来我们探究一下它的执行顺序,看以下代码:
let promise = new Promise(function(resolve, reject){console.log("AAA");resolve()
});
promise.then(() => console.log("BBB"));
console.log("CCC")// AAA
// CCC
// BBB
执行后,我们发现输出顺序总是
AAA -> CCC -> BBB。表明,在Promise新建后会立即执行,所以
首先输出 AAA。然后,then方法指定的回调函数将在当前脚本所有同步任务执行完后才会执行,所以BBB 最后输出。
与定时器混用
首先看一个下面的代码:
let promise = new Promise(function(resolve, reject){console.log("1");resolve();
});
setTimeout(()=>console.log("2"), 0);
promise.then(() => console.log("3"));
console.log("4");// 1
// 4
// 3
// 2
可以看到,结果输出顺序总是:
1 -> 4 -> 3 -> 2。1与4的顺序不必再说,而2与3先输出Promise的then,而后输出定时器任务。原因则是Promise属于JavaScript引擎内部任务,而setTimeout则是浏览器API,而引擎内部任务优先级高于浏览器API任务,所以有此结果。
Promise简单用法相关推荐
- promise的状态值_ES6中的Promise的用法总结
第一部分.什么是Promise ? Promise是ES6中提供的一个异步编程的解决方案,Promise本身是一个构造函数 typeof Promise //function 一般情况下 我们在开发中 ...
- ES6 — Promise基础用法详解(resolve、reject、then、catch,all,)
ES6 - Promise基础用法详解 Promise 是一个构造函数,它自身拥有all.reject.resolve这几个眼熟的方法, 原型上有then.catch等同样熟悉的方法. 所以,在开始一 ...
- 前端js进阶之ES6 Promise(承诺)用法小结笔记、详细解释(resolve,catch,catch)历史最通俗易懂的承诺
什么是Promise? 英文翻译:承诺! js里: Promise 是异步编程的一种解决方案,其实是一个构造函数,自己身上有all.reject.resolve这几个方法,原型上有then.catch ...
- 反编译工具jad简单用法
反编译工具jad简单用法 下载地址: [url]http://58.251.57.206/down1?cid=B99584EFA6154A13E5C0B273C3876BD4CC8CE672& ...
- QCustomPlot的简单用法总结
QCustomPlot的简单用法总结 第一部分:QCustomPlot的下载与安装 第二部分:QCustomPlot在VS2013+QT下的使用 QCustomPlot的简单用法总结 写在前面, ...
- python matplotlib 简单用法
python matplotlib 简单用法 具体内容请参考官网 代码 import matplotlib.pyplot as plt import numpy as np # 支持中文 plt.rc ...
- Windump网络命令的简单用法
Windump网络命令的简单用法 大家都知道,unix系统下有个tcpdump的抓包工具,非常好用,是做troubleshooting的好帮手.其实在windows下也有一个类似的工作,叫windum ...
- Android TabLayout(选项卡布局)简单用法实例分析
本文实例讲述了Android TabLayout(选项卡布局)简单用法.分享给大家供大家参考,具体如下: 我们在应用viewpager的时候,经常会使用TabPageIndicator来与其配合.达到 ...
- shell expect的简单用法
为什么需要expect? 我们通过Shell可以实现简单的控制流功能,如:循环.判断等.但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如 telnet服务器等进 ...
最新文章
- [HTML]JS添加表格
- jQuery $.ajax传递数组的traditional参数传递必须true 对象的序列化
- 生产上oracle扩展表空间,oracle基于裸设备(raw device)扩充表空间
- oracle快捷语句框架中,Oracle框架:PL/SQL编程:
- [BZOJ2038] [2009国家集训队] 小Z的袜子(hose) (莫队)
- Java-Tomcat 5.5 下的JNDI
- python安装xlrd和xlwt及应用
- WindowsAPI中W和A的区别
- latex 中表格怎么指定编号_在医学论文中,应用表格怎么用才是正确的?
- aic值检验 p值_23. 假设检验的时候为什么常写p lt; 0.05,而不写具体的p值?
- 热烈祝贺龙芯Loongarch OpenJDK8开源,已编译完成
- Prometheus正式从CNCF毕业
- java解析字符串_java 拼接字符和解析字符串
- 微信表情包 php,教你用PS给你的室友做一套动态微信豪华表情包
- 解决IDEA报Unmapped Spring configuration files found.Please configure Spring facet
- vscode文件管理只有文件夹的时候也层级显示
- 在多个QQ号码间共享自定义表情(转)
- keras使用load_weights遇到报错
- vue入门之04-生命周期 数据共享
- 在纽约寻找童真——新泽西州乐高乐园探索中心的美好一天
热门文章
- Labview之子面板的使用
- 初中能自学c语言么,我是初中生想自学计算机编程,需要什么
- Huffman 编码原理详解(代码示例)
- 一键重装Win10图文版教程
- 开源数字化校园 CoolSchool即将启动
- 计算机哪个专业对学历要求比较低,高考成绩一般,适合报考的五大专业,学历要求低、好找工作又体面...
- 微信群(腾讯专用服务器),把全国13亿人拉到一个微信群能实现吗?腾讯如此回应.......
- python脚本——selenium自动化执行一些网页上的操作
- matlab Simscape资料
- 如何用化学软件预测核磁共振