初印象
promise的表达从发起请求开始,结果可能是请求被同意,或请求被拒绝。promise状态一经改变,不会再变。只会变化一次。Promise 最终的目的是,是为了执行 then 中的回调函数。
- 使用new Promise()创建一个promise实例
- Promise函数中的第一个参数为一个回调函数,可以称之为executor,通常在这个函数中,会执行发起请求操作,并修改结果的状态值。
-
Promise实例拥有的
then方法,用来处理当请求结果的状态变成resolved时的逻辑。then的第一个参数也为一个回调函数,该函数的参数则是resolve传递出来的数据。在上面的例子中。 -
then方法可以接收两个参数,第一个参数用来处理resolved状态的逻辑,第二个参数用来处理rejected状态的逻辑。 -
then方法因为返回的仍然是一个Promise实例对象,因此then方法可以嵌套使用,在这个过程中,通过在内部函数末尾return的方式,能够将数据持续往后传递。 -
Promise实例拥有的
catch方法,用来处理当请求结果的状态变成rejected时的逻辑。catch的第一个参数也为一个回调函数,该函数的参数则是reject传递出来的数据。相当于then函数的第二个参数。 -
Promise.all方法:当有一个 ajax 请求,它的参数需要另外2个甚至更多请求都有返回结果之后才能确定,那么这个时候,就需要用到Promise.all来帮助我们应对这个场景。
-
Promise.all接收一个由 Promise 对象组成的数组作为参数,当这个数组所有的 Promise 对象状态都变成resolved 或者 rejected 的时候,它才会去调用then方法。 -
Promise.race方法:与Promise.all 相似的是,Promise.race 都是以一个 Promise 对象组成的数组作为参数,不同的是,只要当数组中的其中一个 Promsie 状态变成 resolved 或者 rejected 时,就可以调用.then 方法了。而传递给 then 方法的值也会有所不同。
应用场景
- 前端向服务器发送一个接口请求,请求结果不会立刻返回,而是需要等待一段时间
- 加载图片,需要等待一段时间
- 弹窗中,等待用户点击确认或者取消
- 其它类似需要等待反馈结果的场景
同步与异步
- 同步:指当发送一个请求时,如果未得到请求结果,代码逻辑将会等待,直到结果出来以后才会继续执行之后的代码。
- 异步:异步是指当发起一个请求时,不会等待请求结果,直接继续执行后面的代码。请求结果的处理逻辑,会添加一个监听,等到反馈结果出来之后,在回调函数中处理对应的逻辑。
使用promise模拟一个发起请求函数
异步效果
但是可以使用async/await语法来模拟同步的效果
Ajax:网页与服务端进行数据交互的一种技术
可以通过服务端提供的接口,利用 ajax 向服务端请求需要的数据。
简单的ajax原生实现
看上去不是很麻烦,但是如果有多个Ajax请求,其中一个请求的其中一个参数,需要从上一个ajax请求中获取,就会产生回调地狱,不停的嵌套回调函数。
promise可以解决这个问题
async/await
在函数声明的前面,加上关键字 async,这就是 async 的具体使用。
await 的含义为等待。意思就是代码需要等待 await 后面的函数运行完并且有了返回结果之后,才继续执行下面的代码。这正是同步的效果。
但是我们需要注意的是,await 关键字只能在 async 函数中使用。并且 await 后面的函数运行后必须返回一个Promise 对象才能实现同步的效果。
当我们使用一个变量去接收 await 的返回值时,该返回值为 Promise 中 resolve 传递出来的值(也就是PromiseValue)。
如果使用 async/await 的话,代码结构会更加简洁,逻辑也更加清晰。
异常处理
在Promise中,我们知道是通过 catch 的方式来捕获异常。而当我们使用 async 时,则通过 try/catch 来捕获异常。 如果有多个await函数,那么只会返回第一个捕获到的异常。