原生 Promise 和手写 Promise 的区别是什么?

2022-12-18 0 657

原生植物的 Promise 用的是 microtask,而在应用程序中 polyfill 的 Promise 常常没配套措施采用到 microtask,根本无法采用 task 来演示,但这就意味著 Promise.then 的反弹表达式的继续执行次序跟原生植物的不那样。

原生植物的 Promise.resolve(callback) 和 setTimeout(callback, 0) 一同初始化不然,不论先初始化别的 Promise.resolve 的反弹表达式都很大先继续执行。但没 microtask 而 polyfill 出的 Promise 就不那样,哪两个先被初始化,哪两个的反弹表达式就会先继续执行。这是最主要的差别。

Node 是不受此管制的,即使 Node 很早已有 process.nextTick(callback) 那个小东西,它的跟而后才再次出现的 queueMicrotask 基本上那样。在 Node 采用 process.nextTick 来 polyfill 晚期 Node 还没的 Promise 是没难题的,获得的是符合要求的 Promise。这换句话说 Promise.resolve(callback) 和 setTimeout(callback, 0) 这二者按任一次序一同继续执行不然,Promise 的反弹表达式单厢先促发。

其它标准答案说用 queueMicrotask 来同时实现 Promise,但在产业发展史产业发展的民主化中 Promise 先再次出现,到 queueMicrotask 再次出现时假如应用程序还没全力支持就用 Promise(和 MutationObserver)来 polyfill。

尽管 queueMicrotask 的确能如此一来用作同时实现 Promise,但大部份全力支持 queueMicrotask 的运转自然环境如果都全力支持 Promise 了,为何更要用 queueMicrotask 来同时实现两个 Promise 呢?这其本质上跟 const Promise2 = Promise 无所谓差别……

假如你而已为的是细致地认知 Promise 是怎样处置各式各样特定情形的,倒能透过自学怎样用 queueMicrotask 做 Promise 来展开深入细致介绍。即便 queueMicrotask 是个很简单的表达式,而 Promise 前述要处置的特定情形要繁杂得多。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务