3.04.24Promise对象
1.使用Promise对象
- Promise对象是一个对象,也是一个构造函数
- 该对象用于解决异步编程
- 同步的代码执行:一种按照从上往下执行顺序的编码,可知js是一种同步编程,当代码在执行一件事情时,你不能进行别的操作,比如:你有一个复杂的函数需要运行一段时间,那么这时候页面有输入框的情况,你不能进行输入的操作。
- 异步的代码执行:异步的代码执行就是用于解决同步带来的问题的。异步编程一般是这样的,从上往下执行顺序的过程中遇到需要等待的事件,就给其一个等待的状态A,然后去执行后面的事情,等状态A改变了,就触发某个事件X,就执行事件X。比如,我们的ajax就是这样的道理。
- 用法:
// 定义布尔值(条件)
let isMouseDown = true;
// 创建了promise
let p = new Promise((resolve,reject) => {
if(isMouseDown){
resolve("符合条件");
}else {
reject("失败");
}
})
// 把promise的API拿出来
p.then(
(data)=> {// 代表符合条件的回调函数,如果符合条件,那么执行第一个回调函数
console.log('1.0',data);
},
(err) => { // 代表失败的回调函数,如果不符合条件,那么执行第二个回调函数
console.log('2.0',err);
}
)
//控制台打印:1.0 符合条件
- 分析:
- Promise构造函数需要一个函数A作为参数
- 这个函数A参数需有两个参数,第一个参数等于Promise.then的第一个参数,第二个参数等于Promise.then的第二个参数
- Promise.then需有两个参数,第一个参数为一个函数,第二个参数也是一个函数
- Promise.then的第一个参数函数习惯用于符合函数A的逻辑时执行,Promise.then的第二个参数函数习惯用于不符合函数A的逻辑时执行
- 故Promise构造函数构造出来的实例需要结合Promise.then去发挥作用
2.认识Promise
-
promise的使用如上所示,promise.then()总是会捕捉到promise的状态做出相对应的函数触发。
-
状态的改变从而触发函数,这就像各种事件函数的触发, 事件处理程序是一种特殊类型的回调。回调只是传递给另一个函数的函数,期望回调将在适当的时间被调用。回调曾经是 JavaScript 中实现异步函数的主要方式。 而这往往会产生"回调地狱"的情况,"回调地狱"就是在回调函数里又进行回调,不停地回调,形成回调地狱。
-
由于回调地狱的问题,JavaScript 中异步编程的就采用promise, JavaScript 中异步编程的基础是 promise。
-
理解promise:
- 本质上,Promise 是一个对象,代表操作的中间状态 —— 正如它的单词含义 ‘承诺’ ,它保证在未来可能返回某种结果。虽然 Promise 并不保证操作在何时完成并返回结果,但是它保证当结果可用时,你的代码能正确处理结果,当结果不可用时,你的代码同样会被执行,来优雅的处理错误。
- 通常你不会对一个异步操作从开始执行到返回结果所用的时间感兴趣(除非它耗时过长),你会更想在任何时候都能响应操作结果,当然它不会阻塞其余代码的执行就更好了。
- 你与 Promise 常见的交互之一就是 Web API 返回的 promise 对象。让我们设想一个视频聊天应用程序,该程序有一个展示用户的朋友列表的窗口,可以点击朋友旁边的按钮对朋友视频呼叫。
- 该按钮的处理程序调用 getUserMedia() 来访问用户的摄像头和麦克风。由于 getUserMedia() 必须确保用户具有使用这些设备的权限,并询问用户要使用哪个麦克风和摄像头(或者是否仅进行语音通话,以及其他可能的选项),因此它会产生阻塞,直到用户做出所有的决定,并且摄像头和麦克风都已启用。此外,用户可能不会立即响应权限请求。所以 getUserMedia() 可能需要很长时间。
- 由于 getUserMedia