Promise 讲解如何简单使用方法


在JavaScript的世界中,所有代码都是单线程执行的。

由于这个“缺陷”,导致JavaScript的所有网络操作,浏览器事件,都必须是异步执行。异步执行可以用回调函数实现:

function callback() {
    console.log('Done');
}
console.log('before setTimeout()');
setTimeout(callback, 1000); // 1秒钟后调用callback函数
console.log('after setTimeout()');

观察上述代码执行,在Chrome的控制台输出可以看到:

before setTimeout()
after setTimeout()
(等待1秒后)
Done

一、promise是什么?

1、主要用于异步计算
2、可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果
3、可以在对象之间传递和操作promise,帮助我们处理队列

二、promise的优缺点

优点:

  • 对象的状态不受外界的影响,只有异步操作的结果可以决定是那种状态;
  • 状态一旦改变,就不会再次改变。任何时候都可以得到这个结果。在这里跟(event)事件不同,如果错过了这个事件结果再去监听,是监听不到event事件的。

缺点:

  • promise一旦执行无法取消。
  • 如果不设置回调函数promise内部抛出的错误,不会反映到外部。
  • 当处于pending(进行中)的状态时,无法得知进行到那一阶段(刚开始或者即将完成)。

三、promise方法的使用

3.1 promise.then

then方法:then方法返回的是一个新的promise实例。

注意:如果采用链式的then,可以指定一组按照次序调用的回调函数,如果前一个回调函数返回的是promise,后一个函数会等前一个状态发生改变才会调用。

3.2 promise.catch

catch方法:catch方法是在promise发生错误时的回调。

注意:如果promise状态已经变成resolved,在抛出错误时无效的。promise错误具有‘冒泡’性质,会一直往上传递,直到被捕获。

3.3 promise.all

all方法:all方法用于将多个实例包装成一个新的promise实例。

注意:只有当所有的实例都变成fulfilled时,包装的实例状态,才会变成fulfilled,此时他们的返回值会传递给新的回调函数,只要其中有一个被rejected,包装的实例状态就会变成rejected,此时第一个被rejected的实例返回值会传递给新的回调。

3.4 promise.race

race方法:race方法同样是将多个实例包装成一个新的实例。跟上面的all方法类似。

3.5 promise.allSettled

allSettled方法:allSettled方法接收一组promise实例作为参数,包装成一个新的实例。

注意:只有等所有的实例都返回结果,才会结束。返回的结果不论成功失败,状态总是fulfilled,不会是失败。

3.6 promise.any

any方法:接收一组promise实例作为参数,只要有一个变为fulfilled状态,包装的实例就会变成fulfilled状态,如果所有的参数都变成rejected状态,就会变成rejected状态。

3.7 promise.reject

reject方法:reject方法会返回一个新的实例,状态为rejected。回调函数立即执行。

3.8 promise.try

try方法:在实际开发中遇到无法区分函数是同步还是异步操作时,但是还想用promise来处理,可以使用try方法。

3.9 promise.resolve

resolve方法:将现有对象转为promise对象,它的参数分为四种情况:

  • 参数是一个promise实例;如果参数是promise实例,则不作修改,原样返回。

  • 参数是一个thenable对象,是指由then方法的对象;该方法会将这个对象转为promise对象,然后立即执行then方法。

  • 如果不是具有then方法的对象或者根本不是对象;如果参数是一个原始值,或者是一个不具有then方法的对象,则promise。resolve方法返回一个新的promise对象,状态为resolved

  • 不带有任何参数;如果不带有任何参数会直接返回一个resolved状态的promise对象。

3.10 promise.catch

catch方法:catch方法是在promise发生错误时的回调。
注意:如果promise状态已经变成resolved,在抛出错误时无效的。promise错误具有‘冒泡’性质,会一直往上传递,直到被捕获。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章