Promise
【JS进阶】Javascript 闭包与Promise的碰撞
最近遇到一个比较有意思的题目,解决之后深入地思考了一下。 整理整理我在其中的收获,写个文章分享给大家。 一等公民进入正题之前再聊聊一个话题 —— JavaScript 的一等公民 在 JavaScript 这门语言中,一等公民不仅包含了 变量,对象 等这些名词性的语法,更重要的是 函数 也是一等公民!因此: 函数也可以被当做参数来传递函数也可以作为函数的返回值函数也可以被赋值到某个变量函数也动态地先定义(赋值到某个变量)再执行…
路过,爪机敲点 不需要这俩,这俩是 JS 范围内的。 fs 是 c++ 层面的,异步实现是个 io 线程池。 由于c++层面给的读写文件 api 是同步的。要想同步就当前线程里直接调用拿结果。要想异步就是扔线程里自己跑去,新线程里读写文件这个操作完事了或者某个阶段目标到了通知原始线程。 所以,node 里 sync 的就是直接调读写的。async 的往 io 线程池里扔,确保当前线程不卡。 和你说的这俩没关系。
路过…… 撸了下规范,等撸懂了,扫听下各种答案发现 @李杭帆 已经答挺好了……这里就简化下描述吧…… 实际从规范来说, 是 Promise Resolve Functions 步骤中 FulfillPromise > TriggerPromiseReactions > NewPromiseReactionJob > HostEnqueuePromiseJob 和 NewPromiseResolveThenableJob > HostEnqueuePromiseJob导致的区别 可以看到,前者是 return 俗称的 "非 promise 对象" 情况下处理过程,入队的是 NewPromiseReactionJ…
先回答这三个问题。 1. Promises/A+ 的规范制定目前看没什么漏洞。这个规范本质上就是一个需求文档,只要实现满足需求文档的需求就算是合格的实现。对于需求来说,不存在漏洞。 2. Promise规范和微任务没任何的关系。 至少从Promise规范诞生的历史来看是如此。 3. 从工程师的角度说,死磕 Promise 执行顺序的面试题,就是吹毛求疵。这是大厂面试硬卷出来的结果。就跟早年国外大厂面试只要死命卷算法就能行一个道理。专门为了回答…
路过 肯定泄漏 因为不管如何,没有resolve也没有reject,在 microtask 中待 TryRunMicrotasks 的代码就不会被执行,jobqueues 内必然会有残留内容。这些内容在引擎层不可能会预知到何时被调用(特别是上游host包装的调用,作为下游的引擎层肯定无法预知),必须要保留内容,不会被GC干掉。 如果有 resolve 过,但是这个 resolve 还在其它地方被持有,比如某个一直未被调用的方法。这时虽然 jobqueues 内该任务被执行过,被移除,…
我把整个过程详细分解说一下,同学们就明白了。 接下来的阅读注意两点:一是不要被网上流行的一些帮助初学者快速了解的不严密说法先入为主,跳不出误区。二是不要混淆两个 resolve,即 Promise.resolve (全局对象 Promise(它当然也是构造子)的属性 resolve 函数对象)和 new Promise((resolve, reject)=>...) 里的 resolve(其实质是规范中的 Promise Resolve Function,链接在文末。)。(then 创建新 Promise 实例,其中一…
WHY “PROMISES ARE NOT NEUTRAL ENOUGH” IS NOT NEUTRAL ENOUGH
这篇文章的标题有点绕口,不过大家都懂的,这是一个吐槽手法。 本文就是要吐槽 Staltz 最近写的这篇文章《 Promises are not neutral enough 》。 Staltz 作为 Cycle.js 的作者,也算是社区名人之一。最近他搞了一个大新闻叫 Callbag( Why we need Callbags ),一看名字就是给 callback 招魂的。这篇我不打算吐槽 callbag(想看吐槽 callbag 的可移步:callbag和rxjs有什么区别? ),就单吐槽一下 Staltz 对于 promise 的偏见。S…
猜一猜为什么 vscode 的源码里重新造了 CancellationTokenSource、CancellationToken 等一大堆设施?其实就是为了弥补 Promise 不能取消的缺陷。不然你想象一下你编写代码时按下了一个 .,此时 vscode 向后台的语言服务发异步请求来获取符号信息和补全列表,但是你打的很快,立马又输入了好几个字符,此时如果不把前面的请求取消掉,难道等着后台语言服务一遍又一遍地查找符号吗?再比如点击一个“跳转到定义”,然后突然不想看…
[图片] 一.源码V8 版本 8.4.371,本题的难点在于 resolve 的参数为 Promise 对象。 记第一行 new Promise 生成的 Promise 为 p0。 执行第 2 行 let resolvedPromise = Promise.resolve() 后,resolvedPromise 是一个 fulfilled 状态的 Promise,此时 microtask 队列为空。 执行第 3 行 resolve(resolvedPromise),调用 V8 的 ResolvePromise ,源码如下:// https://tc39.es/ecma262/#sec-promise-resolve-functions transitioning built…
这两天刚好在某个JavaScript引擎中实现并测试好了async/await语法,底层实现肯定是围绕着Promise实现的,但一般来说并不是也没有必要在(C语言或C++语言层面)底层,搞一套模拟generator行为来实现async/await语法,底层有更加简单直接的方法。 经过测试async/await语法是可以正常使用的: [图片] async函数底层实现:async函数行为很简单,就是看函数的返回值是否为Promise,如果不是Promise,则用resolve转成Promise。 await语法会去…
1.什么是 Promisepromise 是目前 js 异步编程的主流解决方案,遵循 Promises/A+ 方案。 2.原理简析(1)promise 本身相当于一个状态机,拥有三种状态 pendingfulfilledrejected 一个 promise 对象初始化时的状态是 pending,调用了 resolve 后会将 promise 的状态扭转为 fulfilled,调用 reject 后会将 promise 的状态扭转为 rejected,这两种扭转一旦发生便不能再扭转该 promise 到其他状态。(2)promise 对象原型上有一个 the…
用 babel 编译成了 promise,这样看应该比较清晰一些,不一定和浏览器原生的实现一致,但也能大概说明问题了。 function p1() { return Promise.resolve().then(function () { return 1; }); } function p2() { return Promise.resolve().then(function () { return Promise.resolve(2); }); } p2().then(res => { console.log(res); // 输出 2 }); p1().then(res => { console.log(res); // 输出 1 });
路过 把乱七八糟的揉到一起去说就是容易麻烦 Promises/A+ 只是讲了 Promise 的具体行为应该怎样。onFulfilled 执行堆栈要平台代码之后调用,也就是必须是在个新调用栈被调,具体咋弄它也不管(看规范附录) 具体到 ES 中,是讲了个兼容 Promises/A+ 的实现方式,用 job 来对应要处理的异步工作,具体谁处理 job 咋弄,它也不管,那是 Host 咋去调用的事情。 而一提 Task Microtask 那必须要限定在现代浏览器环境中的 JS。因为他…
【手写协程】从事件循环到 Promise/Thunk
协程的抽象和实现一件令人不快的事情是。。。最令开发者不快的东西,莫过于一个难以理解的 黑盒 了,JavaScript 提供的这一套协程解决方案就是这么一个东西,其中的 async function 从语法上类似 generator,却返回一个 Promise。我们还知道 co/generator、thunk 这些东西,这让我更迷惑了。他们都做了什么?他们之间有何关系? JavaScript 的协程到底是怎么回事?换句话说: 在 JavaScript 的处理异步逻辑的解决方案中,分为哪…
Promise is an implementation of PromiseLike 我查了一下TypeScript的文档,确实没有明面上写明PromiseLike.但我在源码生成的文档中找到了它。 PromiseLike | typescript - v3.7.7 (microsoft.github.io) 在TypeScript中 PromiseLike 是以Interface 定义的接口类型。它需要实现thenable 特征。其中 then 之函数的签名如下:then( onfulfilled?: function | undefined | null, onrejected?: function | undef…
乍一看还以为 V8 逻辑写的有 bug,和其它引擎提示的完全不一样。 [视频: eshost Promise()] 看了看源码发现,仅仅是文案写的莫名其妙而已。 // 1. If NewTarget is undefined, throw a TypeError exception. if (newTarget == Undefined) { ThrowTypeError(MessageTemplate::kNotAPromise, newTarget); }它这里说的 undefined is not a promise,其实是说 new.target 是 undefined,也就是没有加 new,这个错误提示有点离谱
史上最易读懂的 Promise/A+ 完全实现
其实这就是我之前写的那篇 《一步一步实现一个Promise》 ,只是改了个名字换汤不换药,因为我在公司分享后大家一致觉得代码很容易读,于是就改成这个名字好了~ 下面正文。 本文适用的读者本文写给有一定Promise使用经验的人,如果你还没有使用过Promise,这篇文章可能不适合你,建议先 了解Promise的使用 Promise标准解读只有一个then方法,没有catch,race,all等方法,甚至没有构造函数 Promise标准中仅指定了Promise对象的then…
干脆把 Promise 也手写了(中)——还有异步信号量 Semaphore!
(上一篇: 李杭帆:干脆把 Promise 也手写了(上) ) 真可谓是不会 C++ 的 JavaScript 开发者不是优秀的 C# 开发者!不懂操作系统原理的前端不是好后端! 重磅炸弹!全网独一份。独立实现中,唯一能过 V8 测试集(详见文末列表)的 Promise 实现。当然,这么做有点偏离手写的范畴了,下一篇会给出化简版本。(目前,没有实现 realm filtering 功能。)测试过程中,发现了 Node.js 的一些 bugs(也可以是特性,例如:vm 中的 %P…
未有 Promise 之前 标题魔改 from 《未有天才之前》@鲁迅 PromiseLike 之于 Promise,正如 ArrayLike 之于 Array。在 ES6 横空出世之前,ECMAScript 并没有 Promise 标准内置对象,But TypeScript 是在 ES6 之前破蛋的项目,而且社区已经开始有 Future/Promise 异步模式的相关实践,按照 Promises/A+ 规范使用 thenable 来描述后来的 Promise 对象。 thenable 和 PromiseLike 可以解读为标准未有 Promise 之前的可交互的 Promise…