首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

TypeScript 演化史 — 第五章】将 asyncawait 编译到 ES3ES5 (外部帮助库)

这意味着咱们无法针对 ES3 或 ES5,因为生成器仅在 ES6 中引入TypeScript 2.1 现在支持将异步函数编译为 ES3 和 ES5。...(resolve) { setTimeout(resolve, ms) }) } delay 函数返回一个 promise调用时可以使用 await 来等待这个 promise,如下所示:...另外,你必须让TypeScript知道在运行时,它可以找到 Promise 函数。这在上一章TypeScript 2.0:内置类型声明 有讲过了。...TypeScript外部帮助库 在某些情况下,TypeScript 编译器会将帮助函数注入到在运行时调用生成输出代码中。...当指定此编译器选项时,TypeScript 不会在编译后生成任何帮助函数。这样,捆绑包大小会减少很多。

2.8K20

前端工程师自检清单73答

复制代码 constructor —— 返回对象对应构造函数。...它最大用处有两个,一个是前面提到可以读取函数内部变量,另一个就是让这些变量值始终保持在内存中。 应用:1. 匿名自执行函数 2. 结果缓存 3....理解堆栈溢出和内存泄漏原理,如何防止 堆栈溢出 产生是由于过多函数调用,导致调用堆栈无法容纳这些调用返回地址,一般在递归中产生。...堆栈溢出很可能由无限递归(Infinite recursion)产生,但也可能仅仅是过多堆栈层级. 参考链接:《内存泄漏与避免》 6....Generator (生成器)函数 Generator 函数是 ES6 提供一种异步编程解决方案,其行为类似于状态机。

1.9K21
您找到你想要的搜索结果了吗?
是的
没有找到

TypeScript 演化史 -- 5】将 asyncawait 编译到 ES3ES5 (外部帮助库)

这意味着咱们无法针对 ES3 或 ES5,因为生成器仅在 ES6 中引入TypeScript 2.1 现在支持将异步函数编译为 ES3 和 ES5。...(resolve) { setTimeout(resolve, ms) }) } delay 函数返回一个 promise调用时可以使用 await 来等待这个 promise,如下所示:...另外,你必须让TypeScript知道在运行时,它可以找到 Promise 函数。这在上一章TypeScript 2.0:内置类型声明 有讲过了。...TypeScript外部帮助库 在某些情况下,TypeScript 编译器会将帮助函数注入到在运行时调用生成输出代码中。...当指定此编译器选项时,TypeScript 不会在编译后生成任何帮助函数。这样,捆绑包大小会减少很多。

2.8K40

async与await原理揭秘

再来仔细看下这个函数干了啥,这个函数返回一个函数,而这个返回函数执行会返回一个传入fn返回值也就是那个生成器函数返回值,这个生成器返回值第一次是这个生成器,第二次是它yield语句,把返回结果做成...这个函数就比较简单了,注意上面例子那段话,它就是用trycatch试着运行它next,也就是functionyield,生成器函数会有done属性,如果完成了done就是true,如果没完,把返回值利用...promise.resolve包裹起来递归。...最后再梳理下整个过程,运行p函数>运行_p返回内部_p运行结果——也就是个递归Promise对象,这个对象会自动执行生成器yield,直到运行完。...源码中使用特殊技巧: 这个Promise包裹非常特别,是一个递归一直next直到没有yield才进行resolvepromise,如果下面还有yield,那么就调用Promise.resolve来递归

78841

前端异步代码解决方案实践(二)

实现 then 函数链式调用,只需要在 Promise.prototype.then(..) 处理函数返回 promise 实例即可。但除此之外,还需要依次调用 then 注册回调处理函数。...调用生成器函数并不会立即执行内部语句,而是返回这个生成器迭代器对象。迭代器首次调用 next() 方法时,其内部会执行到 yield 后语句为止。...(),向生成器抛出一个错误 生成器函数继承于 Function 和 Object,不同于普通函数生成器函数不能作为构造函数调用,仅是返回生成器对象。...假如生成器函数中 yield 关键字后全部为同步操作,很容易递归判断返回值 done 是否为 true 运行至函数结束。...,Promise 对象自动执行器,则是在 then 方法内调用递归处理方法。

3.3K60

帮助编写异步代码ESLint规则

应将该值传递给resolve,如果发生错误,则调用 reject 并告知错误信息。 该规则不会阻止你在 Promise 构造函数嵌套回调内返回值。...值是有效 JavaScript(它会立即解析),但这往往表明程序员出错了,比如在调用一个返回 Promise 函数时忘记加上括号。...@typescript-eslint/promise-function-async 该规则强制 Promise 返回函数必须是 async 。...promise非同步函数可能会有问题,因为它可能会抛出一个 Error 对象并返回一个被拒绝promise。...本规则可确保函数返回被拒绝promise或抛出 Error,但绝不会同时返回两种情况。 此外,如果知道所有返回 Promise 函数都被标记为 async ,那么浏览代码库就容易多了。

15510

这次我们来聊聊它是如何被实现

这一步,我们成为 g 为返回生成器对象, gen 为生成器函数。通过调用生成器函数 gen 返回生成器对象 g 。...上边是一个基于 Generator 函数简单执行过程,其实它本质非常简单: 调用生成器函数返回一个生成器对象,每次调用生成器对象 next 方法会执行函数到下一次 yield 关键字停止执行,并且返回一个...(); // 调用传入生成器函数 返回生成器对象 // 期望返回一个Promise return new Promise((resolve) => { // 首次调用 g.next()...在函数 co 中,我们返回了一个 Promise 来作为包裹函数返回值,同时首次调用 co 函数时会调用 gen() 得到对应生成器对象。...本质上还是利用 Generator 函数内部可以被暂停执行特性结合 Promise.prototype.then 中进行递归调用从而实现 Async 语法糖。

69920

Github 4 万 Star!最全面的 Node.js 资源汇总推荐

Folktale - 一套用于 JavaScript 中通用函数编程库,它允许你编写bug更少,重用性更强优雅、模块化应用程序 Mout - 该库与其他现有解决方案之间最大区别是,您可以选择只加载需要模块...Start - 具有可共享预设函数式任务管理器 ygor - 一个基于 Promise 任务执行工具 —— 当需要执行工作太多 npm run 不足以完成任务时 FuseBox - 首选支持 TypeScript...callback 风格函数转化为 Promise 风格 delay - 延迟执行 Promise promise-memoize - 拥有过期时间和预加载功能 Promise 返回值缓存工具 valvelet...2.0 Aedes - 可以在任何流服务器上运行 MQTT 准系统 图像 sharp - 快速用于调整 JPEG,PNG,WebP 和 TIFF 图像大小模块 image-type - 检测...路径方式获取一个套嵌对象属性 onetime - 执行一次性函数 mem - 记忆函数——一种优化技术,通过缓存相同输入函数执行结果来加速连续函数调用 import-fresh - 调用模块时绕开缓存

3.4K31

什么是鸭子🦆类型?

,不过表达意思挺明确,你通过调用传入参数 .quack() 方法检查它是否可以嘎嘎叫,如果它嘎嘎叫了,就返回 true ,如果它没有这个方法,异常就会被捕获,则返回 false。...,我们做了下面几个判断: 检查参数 value 是不是为空 检查参数 value 是否为 object 类型 通过 Reflect.get 方法更安全安全地判断 quack 是不是一个函数 你可能对这种代码再熟悉不过了...TypeScript 解析器,它可能是只鸭子也可能是只猫,你需要再函数逻辑中再做进一步判断。...is 关键字,这在 TypeScript 中被叫做类型谓词(type predicates),类型谓词是一个返回布尔值函数,可以用来做类型保护; 类型保护是可执行运行时检查一种表达式,用于确保该类型在一定范围内...假设我们创建了一个自定义方法来递归遍历对象,解析可能嵌套在里面的任何 Promise,下面就是一个很好用法: function isRecord(value: unknown):

1.9K20

精读《Typescript 4.5-4.6 新特性》

新增 Awaited 类型 Awaited 可以将 Promise 实际返回类型抽出来,按照名字可以理解为:等待 Promise resolve 了拿到类型。...,TS 会因为堆栈过深而报错,但现在可以正确返回执行结果了,因为尾递归优化后,不会形成逐渐加深调用,而是执行完后立即退出当前函数堆栈数量始终保持不变。...JS 目前还没有做到自动尾递归优化,但可以通过自定义函数 TCO 模拟实现,下面放出这个函数实现: function tco(f) { var value; var active = false...这点其实早就该改了,这么严格校验策略让我一度以为 JS 就是不允许 super() 前调用任何函数,但想想也觉得不合理,因为 super() 表示调用父类 constructor 函数,之所以不自动调用...,而需要手动调用 super() 就是为了开发者可以灵活决定哪些逻辑在父类构造函数前执行,所以 TS 之前一刀切行为实际上导致 super() 失去了存在意义,成为一个没有意义模版代码。

64720

你真的懂异步编程吗?

可以在 yield 接受返回值 generator.next('test123'); Generator 最大特点就是让函数运行,可以暂停,不要小看他,有了这个暂停,我们能做事情就太多,在调用异步代码时...Generator 异步方案 将调用ajax代码写到 生成器函数 yield 后面,每次异步执行,都要在 yield 中暂停,调用返回结果是一个 Promise 对象,我们可以从 迭代器对象...,是相同嵌套,因此可以写成递归方式对执行器进行改造: // 声明一个生成器函数 function * fun(){ yield myAjax('..../d3.json') } // 返回 遍历器对象 var f = fun(); // 递归方式 封装 // 生成器函数执行器 function handle(res){ if(res.done...,进行封装复用,形成独立函数模块; function co(fun) { // 返回 遍历器对象 var f = fun(); // 递归方式 封装 // 生成器函数执行器

81830

JavaScript 权威指南第七版(GPT 重译)(五)

yield*可以与任何类型可迭代对象一起使用,包括使用生成器实现可迭代对象。这意味着yield*允许我们定义递归生成器,你可以使用这个特性来允许对递归定义树结构进行简单递归迭代,例如。...每次调用迭代器next()方法时,生成器函数另一个块会运行。 生成器函数可以使用yield运算符指定迭代器返回值。每次调用next()都会导致生成器函数运行到下一个yield表达式。...当getJSON()返回时,回调函数会异步调用,因此它也是异步,不能有意义地抛出异常(因为没有代码在调用堆栈上处理它)。...特别要注意是,promiseSequence() 中嵌套函数似乎递归调用自身,但因为“递归调用是通过 then() 方法进行,实际上并没有传统递归发生: // This function takes...“species”继承,并在数组子类上调用map()将返回实例而不是子类实例。

17510

JavaScriptNode.js 有协程吗?

协程一个特点是通过关键字 yield 调用其它协程,接下来每次协程被调用时,从协程上次 yield 返回位置接着执行,这种通过 yield 协作转移执行权操作,彼此没有调用者和被调用关系,是彼此平等对称一种关系...在异步操作回调函数里,一旦出错原始调用栈早已结束,引入协程之后每个任务可以保持自己调用栈,这样解决一大问题是出错误时可以找到原始调用栈。 看下生成器函数与普通函数有什么区别?...生成器函数看似和普通函数相似,其实内部执行机制是完全不同生成器函数在内部执行遇到 yield 会交出函数执行权给其它协程(此处类似 CPU 中断),转而去执行别的任务,在将来一段时间后等到执行权返回...对于其他所有函数,它们数据都分配在被调用堆栈上,因此从协程调用所有函数必须在挂起协程之前完成。协程保留其状态所需所有数据都在堆上动态分配。...这通常需要几个局部变量和参数,其大小远小于预先分配整个堆栈”。

3.8K30

使用 Node.js 实现文件流转存服务

Promise就会返回异常,所以在最初2次调用Promise都会触发catch函数。...不过在每次catch时候,再递归函数,之前错误Promise就能够被递归创建Promise处理,直到这个Promise能够成功返回。我们只需简单控制max值,就能控制处理错误次数。...所以我们也可以使用这样逻辑来进行分片发送,当请求出现错误时候,在catch函数内判断重试次数,次数若大于0,则再返回一个递归send函数,直到次数等于0,直接用Promise.reject将异常抛出...如何在所有分片都上传完成之后触发一个回调 到目前为止,整个服务核心部分已经差不多了,send函数无论怎么调用,都会返回Promise对象,所以在所有分片都上传完成之后触发一个回调也就很容易了,只需要将所有的...send函数返回Promise对象放进数组,然后通过Promise.all函数来捕获即可,可见,基建搭好,上层建筑建设也就轻而易举了。

3.2K10

【深扒】深入理解 JavaScript 中异步编程

后面的 then 方法是为上一个 then 返回 Promise 对象注册回调 前一个 then 方法中回调函数返回值会作为后面 then 方法回调参数 链式调用目的是为了解决回调函数嵌套问题...main ,然后在这个函数内部使用 yield 去返回一个 ajax 调用,也就是返回了一个 Promise 对象。...我们可以在外界去调用生成器函数得到它迭代器对象,然后调用这个对象 next 方法,这样 main 函数就会执行到第一个 yield 位置,也就是会执行到 ajax 调用,这里 next 方法返回对象...part 我们已经解释过了 在 yield foo(11, 31) 中,首先调用 foo(11, 31) 没有返回值,发送请求获取数据,请求成功,调用 it.next(data) ,这样就将 data...并且可以直接在外面调用这个函数,执行这个函数的话,内部这个执行过程会跟 Generator 函数会是完全一样 相比于 Generator 函数 async 函数最大好处就是不需要去配合一些工具去使用

60620

ES6:【深扒】深入理解 JavaScript 中异步编程

Promise 对象可以继续调用then实现链式调用 后面的 then 方法是为上一个 then 返回 Promise 对象注册回调 前一个 then 方法中回调函数返回值会作为后面 then 方法回调参数...main ,然后在这个函数内部使用 yield 去返回一个 ajax 调用,也就是返回了一个 Promise 对象。...我们可以在外界去调用生成器函数得到它迭代器对象,然后调用这个对象next方法,这样main函数就会执行到第一个yield位置,也就是会执行到ajax调用,这里next方法返回对象value值就是...part 我们已经解释过了 在 yield foo(11, 31) 中,首先调用 foo(11, 31) 没有返回值,发送请求获取数据,请求成功,调用 it.next(data) ,这样就将 data...并且可以直接在外面调用这个函数,执行这个函数的话,内部这个执行过程会跟Generator函数会是完全一样 相比于Generator函数async函数最大好处就是不需要去配合一些工具去使用,类似于Co

65720

前端面试题

创造promise实例后,它会立即执行。 Promise可以解决:1.回调地狱,代码难以维护, 常常第一个函数输出是第二个函数输入这种现象。...3.promise可以解决异步问题,本身不能说promise是异步 2、什么是闭包 有权访问另一个函数作用域中局部变量函数就是闭包。...TypeScript 是 JavaScript 一个集,支持 ECMAScript 6 标准。.../类数组转数组 9、Set 去重原理是什么 set() 函数中会先调用对象 hash() 方法,获取 hash 结果; 如果 hash 结果相同,用比较操作符 == (也就是调用函数 eq())判断二者值是否相等...6、如何理解递归,一般应用场景在哪些地方 如果一个函数在内部调用自身本身,这个函数就是递归函数。 应用场景: 数组求和、数组扁平化、斐波拉契数列、数组对象格式化等。

1.2K20

【深扒】深入理解 JavaScript 中异步编程

后面的 then 方法是为上一个 then 返回 Promise 对象注册回调 前一个 then 方法中回调函数返回值会作为后面 then 方法回调参数 链式调用目的是为了解决回调函数嵌套问题...main ,然后在这个函数内部使用 yield 去返回一个 ajax 调用,也就是返回了一个 Promise 对象。...我们可以在外界去调用生成器函数得到它迭代器对象,然后调用这个对象 next 方法,这样 main 函数就会执行到第一个 yield 位置,也就是会执行到 ajax 调用,这里 next 方法返回对象...part 我们已经解释过了 在 yield foo(11, 31) 中,首先调用 foo(11, 31) 没有返回值,发送请求获取数据,请求成功,调用 it.next(data) ,这样就将 data...并且可以直接在外面调用这个函数,执行这个函数的话,内部这个执行过程会跟 Generator 函数会是完全一样 相比于 Generator 函数 async 函数最大好处就是不需要去配合一些工具去使用

68420
领券