前端答题(八)Promise概述
2022-2-21 zgn
- 导航
- Promise概念
- 异步同步
- 回调概述
一、Promise概念
Promise 对象用于表示一个异步操作的最终完成 (或失败)及其结果值。(MDN)
-
首先从这个写法我们可以看出这是一个构造函数的命名方式,它构造的对象包含的一些属性,能够很好的规范我们使用异步操作,避免问题出现。
-
如果感到疑惑,那么就先来看一下什么是异步
二、异步同步
异步的含义是:计算机多线程的异步处理。与同步处理相对,异步处理不用阻塞当前线程来等待处理完成,而是允许后续操作,直至其它线程将处理完成,并回调通知此线程或隔一段时间去轮询后的返回值,等待时间可以做其他事。
同步则必须等待处理完成,拿到结果后再执行其它,等待时间不能做其他事。
- 示例
// 异步
for (var i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i)
})
} // 经典小测试 输出的 i 是几?
- 这就是一个简单的异步操作,我们在for循环执行的时候,并没有马上拿到结果,输出 i 的值,而是间隔一小会后才输出
- 而且我们并没有直接调用setTimeout函数拿到结果,而是编辑器在我们的代码结束后去调用setTImeout函数输出值,那么这就是回调
三、回调概述
异步调用是一种程序处理的机制,被调用的函数在处理完成后,会主动通知调用者(例返回值)这就是回调。回调和异步调用的关系非常紧密,但是不一定只能用在异步中。同步调用是三者当中最简单的,而回调又常常是异步调用的基础
- 除了我们上面写到的setTimeout以外,前端常用的Ajax也是非常典型的异步操作,等等还有很多,他们都用到了异步和回调
- 但是看似非常好用的回调,实际上有很多的问题,比如:
- 回调地狱。简单来说就是函数比较复杂的回调中,往往会有很多层,使我们的代码变得难以理解
- 函数太多没有统一的命名规范,每个程序员的命名习惯不同,再加上复杂的代码,就使得维护非常困难
- 难以进行后期的错误处理
那如何解决这些问题呢!
答案就写在了开头! Promise!
回顾Promise
- 使用方法
- Promise的使用方法非常简单
// 1. 使用new 构造Promise对象,如果不了解new可以看我的上一篇文章
let a = new Promise();
a.then(success,fail)// then方法后的第一个参数表示执行成功的回调,第二个表示失败的回调
// 2. 在封装函数时候使用Promise
// 在函数体内部第一句写入
return new Promise((resolve,reject)=={'你的函数体,写上resolve和reject'})
// 成功时回调第一个,失败时回调第二个 和then相对应
- promise更是一种回调的规范,是目前前端解决回调的统一办法
- resolve,reject函数名并不固定,注意位置,而且他们只接收一个参数