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错误具有‘冒泡’性质,会一直往上传递,直到被捕获。