之前写过一篇关于Promise和setTimeout谁先执行的文章: Promise vs setTimeout,最近看到一个属于技巧型的东西:Promise.resolve().then(),我们先来看看Promise.resolve()基本的一些用法。

含then方法对象

Promise.resolve()里面的参数主要分为是Promise和不是Promise两种,如果是Promise的话,直接返回那个Promise对象;如果不是Promise但是带有then对象的,会直接执行then方法:

相当于把then方法变成了new Promise(***)里面的执行方法。为什么这么说呢?因为我们在then方法里面reject也是可以的:

也就是说Promise.resolve()遇到了含有then方法的对象,就和使用new Promise(***)是一样的,但是如果遇到了一个没有then方法的对象那么就会直接返回这个对象:

上面的例子中,obj含有then1方法,没有then方法,一字之差,那么Promise.resolve()就会直接返回obj:{then1(){****}}这个对象。

需要注意,Promise.reject()对含有then方法的对象没有开放这样的特权,如果Promise.reject()遇到含有then方法的对象,会直接返回这个对象:

上面的代码,Promise.reject()会直接返回obj:{then(){****}}这个对象。

Promise.resolve().then()有何妙用

如果Promise.resolve()遇到其他类型,一般都会原数返回,同时它还可以不传任何参数。

有些时候会看到有人写Promise.resolve().then(***)这样的方法:

平常我们用setTImeout(fn,0)这个比较多,就是等当前的所有同步操作完再执行,实际上Promise.resolve().then()能够比setTimeout(fn,0)更加准确的监听到所有同步操作的完成,因为Promise.resolve().then()是在宏任务的末尾添加了事件,而setTimeout(fn,0)是新开了一个宏任务。

其他文章

0
我要评论

评论

返回
×

我要评论

回复:

昵称:(昵称不超过20个字)

图片:

提交
还可以输入500个字