目录
07.util.promisify方法进行promise风格化
02. 一个 promise 指定多个成功/失败回调函数, 都会调用吗?
04. promise.then()返回的新 promise 的结果状态由什么决定?
1.promise的基本使用
01.promise的介绍
01.1 Promise 是什么
?
01.1.1. 理解
1. 抽象表达
:
1) Promise 是一门新的技术
(ES6
规范
)
2) Promise 是
JS
中进行异步编程的
新解决方案
备注:旧方案是单纯使用回调函数
2. 具体表达
:
1) 从语法上来说
: Promise
是一个构造函数
2) 从功能上来说
: promise
对象用来封装一个异步操作并可以获取其成功
/失败的结果值
01.1.2. promise 的状态改变
1. pending 变为
resolved
2. pending 变为
rejected
说明:
只有这
2
种
,
且一个
promise
对象只能改变一次
无论变为成功还是失败,
都会有一个结果数据
成功的结果数据一般称为 value,
失败的结果数据一般称为
reason
01.1.3. promise 的基本流程
01.2. 为什么要用
Promise?
01.2.1. 指定回调函数的方式更加灵活
1. 旧的
:
必须在启动异步任务前指定
2. promise: 启动异步任务
=>
返回
promie
对象
=>
给
promise
对象绑定回调函数(甚至可以在异 步任务结束后指定
/
多个
)
01.2.2. 支持链式调用
,
可以解决回调地狱问题
1. 什么是回调地狱
?
回调函数嵌套调用,
外部回调函数异步执行的结果是嵌套的回调执行的条件
2. 回调地狱的缺点
?
不便于阅读
不便于异常处理
3. 解决方案
?
promise 链式调用
4. 终极解决方案
?
async/await
# 笔记
## 异步编程
* fs 文件操作
```js
require('fs').readFile('./index.html', (err,data)=>{})
```
* 数据库操作
* AJAX
```js
$.get('/server', (data)=>{})
```
* 定时器
```js
setTimeout(()=>{}, 2000);
```
## Promise 的状态
实例对象中的一个属性 『PromiseState』
* pending 未决定的
* resolved / fulfilled 成功
* rejected 失败
## Promise 对象的值
实例对象中的另一个属性 『PromiseResult』
保存着异步任务『成功/失败』的结果
* resolve
* reject
02.promise初体验
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>基本使用</title>
<link crossorigin='anonymous' href="https://cdn.bootcss.com/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<h2 class="page-header">Promise 初体验</h2>
<button class="btn btn-primary" id="btn">点击抽奖</button>
</div>
<script>
//生成随机数
function rand(m,n){
return Math.ceil(Math.random() * (n-m+1)) + m-1;
}
/**
点击按钮, 1s 后显示是否中奖(30%概率中奖)
若中奖弹出 恭喜恭喜, 奖品为 10万 RMB 劳斯莱斯优惠券
若未中奖弹出 再接再厉
*/
//获取元素对象
const btn = document.querySelector('#btn');
//绑定单击事件
btn.addEventListener('click', function(){
//定时器
// setTimeout(() => {
// //30% 1-100随机数字出现 1或2或...一直到30的概率就是30%
// //获取从1 - 100的一个随机数
// let n = rand(1, 100);
// //判断
// if(n <= 30){
// alert('恭喜恭喜, 奖品为 10万 RMB 劳斯莱斯优惠券');
// }else{
// alert('再接再厉');
// }
// }, 1000);
//Promise 形式实现
// resolve 解决 函数类型的数据
// reject 拒绝 函数类型的数据
const p = new Promise((resolve, reject) => {
setTimeout(() => {
//获取从1 - 100的一个随机数
let n = rand(1, 100);
//判断
if(n <= 30){
resolve(n); // 将 promise 对象的状态设置为 『成功』
}else{
reject(n); // 将 promise 对象的状态设置为 『失败』
}
}, 1000);
});
console.log(p);
//调用 then 方法
// value 值
// reason 理由
p.then((value) => {
alert('恭喜恭喜, 奖品为 10万 RMB 劳斯莱斯优惠券, 您的中奖数字为 ' + value);
}, (reason) => {
alert('再接再厉, 您的号码为 ' + reason);
});
});
</script>
</body>
</html>
03.promise实践练习-fs读取文件
//
const fs = require('fs');
//回调函数 形式
// fs.readFile('./resource/content.txt', (err, data) => {
// // 如果出错 则抛出错误
// if(err) throw err;
// //输出文件内容
// console.log(data.toString());
// });
//Promise 形式
let p = new Promise((resolve , reject) => {
fs.readFile('./resource/content.tx', (err, data) => {
//如果出错
if(err) reject(err);
//如果成功
resolve(data);
});
});
//调用 then
p.then(value=>{
console.log(value.toString());
}, reason=>{
console.log(reason);
});
04.promise实践练习-AJAX请求
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Promise 封装 AJAX</title>
<link crossorigin='anonymous' href="https://cdn.bootcss.com/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<h2 class="page-header">Promise 封装 AJAX 操作</h2>
<button class="btn btn-primary" id="btn">点击发送 AJAX</button>
</div>
<script>
//接口地址 https://api.apiopen.top/getJoke
//获取元素对象
const btn = document.querySelector('#btn');
btn.addEventListener('click', function(){
//创建 Promise
const p = new Promise((resolve, reject) => {
//1.创建对象
const xhr = new XMLHttpRequest();
//2. 初始化
xhr.open('GET', 'https://api.apiopen.top/getJoke');
//3. 发送
xhr.send();
//4. 处理响应结果
xhr.onreadystatechange = function(){
if(xhr.readyState === 4){
//判断响应状态码 2xx
if(xhr.status >= 200 && xhr.status < 300){
//控制台输出响应体
resolve(xhr.response);
}else{
//控制台输出响应状态码
reject(xhr.status);