Promise
面试官:“你能手写一个 Promise 吗”
关于手写 Promise,想必大家都十分熟悉。基本上现在不管是大厂还是小厂,手写 promise 已经成为了面试必考知识点。听说你还不太会?那么走着,带你从零开始解锁 Promise! 查看完整代码请戳:github.com/qiruohan/ar… 常见 Promise 面试题首先,我们以常见的 Promise 面试题为切入点,我们看看面试官们都爱考什么: Promise 解决了什么问题?Promise 的业界实现都有哪些?Promise 常用的 API 有哪些?能不能手写一个符合 Promise…
可以用 DevTools 的 queryObjects()函数配合 setTimeout()来测试一下: [图片] 可以看到 1 万个 pending 的 promise 对象都不会被回收,直到 10 秒钟以后,再次执行 queryObjects(Promise): [图片] 那 1 万个 promise 对象是被回收了,但又多出一个 pending 的 promise 对象,可能是 DevTools 上执行命令的副作用。 还可以测试一下通过事件回调来 resolve 的情况: [图片] 点击一下页面后,再次执行 queryObjects(Promise),居然已经 resolve 了的 1 …
史上最易读懂的 Promise/A+ 完全实现
其实这就是我之前写的那篇 《一步一步实现一个Promise》 ,只是改了个名字换汤不换药,因为我在公司分享后大家一致觉得代码很容易读,于是就改成这个名字好了~ 下面正文。 本文适用的读者本文写给有一定Promise使用经验的人,如果你还没有使用过Promise,这篇文章可能不适合你,建议先 了解Promise的使用 Promise标准解读只有一个then方法,没有catch,race,all等方法,甚至没有构造函数 Promise标准中仅指定了Promise对象的then…
前几年回答过一次这个问题,再重新回答一次。 想要知道 promise 对象有没有被回收掉,可以在控制台使用 queryObjects() : [图片] queryObjects(Promise) 做的是就是先手动执行一次垃圾回收,然后输出当前页面内存里还存在的 promise 对象。有 0 个,证明所有的 promise 对象都已经被回收了。 为了更明确的看到回收的确发生了,我们还可以给传入 test() 的 promise 对象和 test() 返回的 promise 对象都添加上垃圾回收的回调: [图片] 可以看到…
理解JavaScript Promise
本文目标从一脸懵逼,到认识、掌握并使用Promise…… ES2015出来之后,什么箭头函数、类声明、解构赋值等新概念冒了出来,其中一个重要的概念就是Promise。不学会Promise,都不好意思说自己懂ES6了! 那么Promise到底是个什么鬼?!像我这样的JavaScript小菜,初次看到,着实一脸懵逼。 本文结构本文从下面几个问题,逐步了解JavaScript Promise的概念和用法,重点是概念啦,用法什么的网上有很多资料参考 Promise是什么? 有什…
不是。TC39 曾经有人提案过取消 Promise 的 API,但最后讨论一番后作者撤销了提案。以下是 TC39 GitHub 上的提案: GitHub - tc39/proposal-cancellation: Proposal for a Cancellation API for ECMAScript 已经有人写过长文为什么 Promise 不应该有可取消的 API: https://benlesh.medium.com/promise-cancellation-is-dead-long-live-promise-cancellation-c6601f1f5082 根据 TC 历史讲故事的工作交给 @贺师俊 吧,我直接说一下为什么 Promise 不能被取消吧。首先,Promise 被设计为 eager,也就是一旦启动就立即…
图解 Promise 实现原理(一)—— 基础实现
摘要很多同学在学习 Promise 时,知其然却不知其所以然,对其中的用法理解不了。 本系列文章由浅入深逐步实现 Promise,并结合流程图、实例以及动画进行演示,达到深刻理解 Promise 用法的目的。图解 Promise 实现原理(一)—— 基础实现 图解 Promise 实现原理(二)—— Promise 链式调用 图解 Promise 实现原理(三)—— Promise 原型方法实现 图解 Promise 实现原理(四)—— Promise 静态方法实现 前言本文适合对 Promise 的…
致全网那些所谓的手写Promise.all
一句话总结那些所谓的手写Promise.all,我几乎没在网络里找到完全正确的,希望写文章的大佬们能轻虐新人,严谨创作,不要误人子弟。 背景手写Promise常见于面试题,目的是考察候选人对Promise.all这个API的了解,Promise和Iterator的理解,顺便看一下ES6的熟悉程度。 题目Promise.all的完成体应该符合以下特征: 输入为Iterator类型的参数,可以是Array,Map, Set,String ,可能也得包括魔改的Iterator(Symbol.iterator)之类…
你不知道的promise
Promise基本上现在不管是大厂还是小厂,promise 已经成为了面试必考知识点;关于 Promise,想必大家都又所了解,可是又掌握了多少,真正面试的时候,又能有多少把握呢?,今天小编特意在此整理promise常考知识点,希望对你的面试保驾护航。 常见 Promise 面试题首先,我们以常见的 Promise 面试题为切入点,我们看看面试官们都爱考什么: Promise 解决了什么问题 & 业界实现?Promise 的基础特征?Promise 常用的 API 有哪些?能…
十五行代码带你搞懂Promise
程序员闭嘴不说话系列。 什么是Promise?本代码用定外卖来举例子,让你明白。 // 定外卖就是一个Promise,Promist的意思就是承诺 // 我们定完外卖,饭不会立即到我们手中 // 这时候我们和商家就要达成一个承诺 // 在未来,不管饭是做好了还是烧糊了,都会给我们一个答复 function 定外卖(){ // Promise 接受两个参数 // resolve: 异步事件成功时调用(菜烧好了) // reject: 异步事件失败时调用(菜烧糊了) return new Promise((…
原生的 Promise 用的是 microtask,而在浏览器中 polyfill 的 Promise 往往没办法使用到 microtask,只能使用 task 来模拟,但这就意味着 Promise.then 的回调函数的执行顺序跟原生的不一样。 原生的 Promise.resolve(callback) 和 setTimeout(callback, 0) 一起调用的话,无论先调用哪个 Promise.resolve 的回调函数都一定先执行。但没有 microtask 而 polyfill 出来的 Promise 就不一样,哪一个先被调用,哪一个的回调函数就会…
猜一猜为什么 vscode 的源码里重新造了 CancellationTokenSource、CancellationToken 等一大堆设施?其实就是为了弥补 Promise 不能取消的缺陷。不然你想象一下你编写代码时按下了一个 .,此时 vscode 向后台的语言服务发异步请求来获取符号信息和补全列表,但是你打的很快,立马又输入了好几个字符,此时如果不把前面的请求取消掉,难道等着后台语言服务一遍又一遍地查找符号吗?再比如点击一个“跳转到定义”,然后突然不想看…
JS引擎中的Promise实现当然跟setTimeout没有啥关系。 我们假设题主问的是「手写Promise」,那自然需要依赖某种异步API。如果按照规范,那么最合适的是 queueMicrotask() 。不过这个API是很新的(所以可以看到mdn上其polyfill本身反过来是用Promise实现的),而手写Promise通常是为了能在前ES6时代的环境下使用,多数情况下用的是在早年就已经有的API,而setTimeout是最古老的一种,故而被用于兜底。写得比较考究的「手写Promise…
写一个符合 Promises/A+ 规范并可配合 ES7 async/await 使用的 Promise
原文地址 从历史的进程来看,Javascript 异步操作的基本单位已经从 callback 转换到 Promise。除了在特殊场景使用 stream ,RxJs 等更加抽象和高级的异步数据获取和操作流程方式外,现在几乎任何成熟的异步操作库,都会实现或者引用 Promise 作为 API 的返回单位。主流的 Javascript 引擎也基本原生实现了 Promise。在 Promise 远未流行以前,Javascript 的异步操作基本都在使用以 callback 为主的异步接口。鼠标键盘事件,页面渲…
Promise V8 源码分析(一)
本文基于 node 版本 14.13.0,V8 版本 8.4.371。Promise 源码全部位于 V8,node 版本不重要。很早就想写 Promise 源码相关的文章,但 V8 中 Promise 的源码之前(18、19年)是用 CodeStubAssembler 写的,很多前端看不懂 CodeStubAssembler 这种汇编风格的语言,考虑现实选择放弃。直到两个月前无意中发现 V8 的新版本已经用 Torque 重写了 Promise 的大部分代码,遂有此文。预计写 2-3 篇文章,本文介绍的内容是 Promise 构造函…
利用 generator 解决回调地狱
回调地狱在 JS 中,常常出现多个异步操作需要逐步完成的情况,例如相继获取多个 API 的结果,最简单的方法是通过嵌套的回调实现: function sleep(cb){ setTimeout(cb, 1000) } function getAuthor(cb){ sleep(() => { cb('codefalling') }) } function getBlog(cb, author){ sleep(() => { if (author === 'codefalling') { cb('https://codefalling.com') } }) } getAuthor(author => { console.log(`Author: ${author}`) getB…
这是一篇傻瓜都能看懂的Promises文章!
以下内容出自scotch上Jecelyn Yeen的分享哦。 此文目的只有一个:让我们更容易的了解JavaScript Promises! JavaScript Promises其实不难。然而,很多人一开始就觉得有点难理解.。因此我想用一种假设的方式写下我理解promise。 (一)理解promises举个简单例子: 想象你是一个孩子。你老妈承诺下礼拜 给你买个新手机。你 [不知道] 你是否会得到手机直到下礼拜。你老妈可以真的买你一个全新的手机,也可以让你滚蛋并告诉你不买了…
不是,一个是微任务,一个是宏任务。这篇翻译文章可能会更好的解释这个问题。 更多内容,欢迎关注我的公众号:dingtingli-pub点击访问: 原文地址 作者: Lydia Hallie 你是否遇到过 JavaScript 代码没有按照你预期的方式来运行?看起来就好像是函数在随机、不可预测的时间被执行,或者是被延迟执行。这时候,你可能是在处理 ES6 中的新特性: Promises。 多年之前的好奇心终于有了回报,在又一次的不眠之夜中我终于有时间做了一些…