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

原生JS灵魂之问(下), 冲刺进阶最后一公里(附个人成长经验分享)

那如果换成非阻塞I/O,调用返回后我们的 nodejs 应用程序可以完成其他的事情,而操作系统同时也在进行 I/O。...Promise }); x.then(/* 内部逻辑省略 */) 我们会根据 then 中回调函数的传入值创建不同类型的Promise, 然后把返回的 Promise 穿透到外层, 以供后续的调用。...这里的 x 指的就是内部返回的 Promise,然后在 x 后面可以依次完成链式调用。 这便是返回值穿透的效果。...onRejected : error => { throw error }; 然后对返回Promise的情况进行处理: function resolvePromise(bridgePromise, x,...回到父协程中,父协程的第一件事情就是对await返回的Promise调用then, 来监听这个 Promise 的状态改变 。

2K10

ES6 Promise 的最佳实践

当操作完成或引发错误时,将以 Error 对象(如果有)作为第一个参数传递来调用回调函数。如果未引发错误,则第一个参数将作为 null 传递。...resolve 的返回值 (Promise#then处理程序的代码)被延迟到当前调用堆栈完成剩余的顶级代码。...此外,考虑到 Promise API 大量使用了闭包和回调函数(它们都需要自己的堆分配),令人惊讶的是,一个 promise 就需要大量的内存。...同步的 promise 是不必要且多余的 像前面所说,promise 不会神奇地产生新线程。因此,一个完全同步的执行器函数(对于 Promise 构造函数)仅仅是一个不必要的中间层。...但是,必须注意,由于 Promise API 是可以链式调用的,因此每次调用Promise#then都会构造并返回一个新的 Promise 实例(保留了某些先前的状态)。

1.2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    「Nodejs进阶」一文吃透异步IO和事件循环

    一 前言 本文讲详细讲解 nodejs 中两个比较难以理解的部分异步I/O和事件循环,对 nodejs 核心知识点,做梳理和补充。...如何合理的看待Nodejs中异步I/O 前端开发者可能更清晰浏览器环境下的 JS 的异步任务,比如发起一次 ajax 请求,正如 ajax 是浏览器提供给 js 执行环境下可以调用的 api 一样 ,在...用一幅图表示四者的关系: 3.jpg 总结上述过程: 第一阶段:每一次异步 I/O 的调用,首先在 nodejs 底层设置请求参数和回调函 callback,形成请求对象。...(callback, args); } 当调用 setImmediate 本质上调用 nodejs 中的 setImmediate 方法,首先校验回调函数,然后创建一个 Immediate 类。...在每一次事件循环中,会先执行一个setImmediate 回调,然后清空 nextTick 和 Promise 队列的内容。

    2.1K20

    Node.js 源码解析 util.promisify 如何将 Callback 转为 Promise

    工作中对于一些老项目,有 callback 的通常也会使用 util.promisify 进行转换,之前更多是知其然不知其所以然,本文会从基本使用和对源码的理解实现一个类似的函数功能。 1....转换为 promise,核心实现如下: 行 {1} 校验传入的参数 original 是否为 Function,不是则抛错 promisify(fs.readFile) 执行之后会返回一个函数 fn,...行 {2} 定义待返回的 fn 函数,行 {3} 处返回 fn 返回的是一个 Promise 对象,在返回的 Promise 对象里执行 callback 函数 function mayJunPromisify.../module/promisify 总结 util.promisify 是 Nodejs 提供的一个实用工具函数用于将 callback 转为 promise,本节从基本使用 (err, result...转 Promise、自定义 Promise 函数重写 util.promisify 返回值、Promisify 回调函数的多参转换三个方面进行了讲解,在理解了其实现之后自己也可以实现一个类似的函数。

    2.5K10

    NodeJS的异常捕获

    正文 由于nodejs是非阻塞单进程单线程的,一旦nodejs抛出异常,整个服务就会停掉。服务将会非常不稳定。...错误异常有两种场景的出现, 一种是代码运行中throw new error没有被捕获 另一种是Promise的失败回调函数,没有对应的reject回调函数处理 针对这两种情况Nodejs都有默认的统一处理方式...对象 方法 & 描述 1 domain.create() 返回一个domain对象。...5 domain.bind(callback) 返回的函数是一个对于所提供的回调函数的包装函数。当调用这个返回的函数时,所有被抛出的错误都会被导向到这个域的 error 事件。...除了捕捉被抛出的错误外,它还会拦截 Error 对象作为参数传递到这个函数。 7 domain.enter() 进入一个异步调用的上下文,绑定到domain。

    6K50

    Nodejs Serialport文档翻译

    它提供一个非常简单的接口所需要的串口程序代码Arduino 单片机, X10 无线通信模块, 或者甚至是上升到 Z-Wave 和Zigbee ....Alpine Linux Alpine 是一个(非常)小的linux开发版系统, 但是它使用组织标准库来代替函数库 (大多数开发版linux系统使用的), 所以他需要编译。...当你可以在任何时候能读出和写入(它会在打开的串口中排列),大多数串口函数要求一个开启的串口。当串口是打开的时候,你可以使用以下三个方式调用代码。 open事件经常会触发当串口打开的时候。...尽管串口是一个流,但当写入它可以接受的字节数组除了字符串和缓存时,这个格外的功能非常有用。...写入 data 以及等待直到在调用回调之前,结束对目标串口的传输。

    2.7K30

    全栈必备JavaScript基础

    || 和&& 更应该算是选择器运算符,其返回值不一定是布尔值,而是两个操作数其中的一个值。一般先对第一个操作数进行toBoolean强制类型转换,然后再执行条件判断。例如:a||b 理解成a?...如果函数没有返回其他对象,那么new表达式中的函数调用会自动返回这个新对象 如果同时存在多种绑定,那么绑定的优先级大致如下: 由new调用绑定到新创建的对象 由call 或者apply(或bind)调用绑定到指定的对象...中传入空数组,会立即完成, 而Promise.race([..]) 则会挂住。 在各种Promise库中,finally ( .. ) 还是会创建并返回一个新Promise的。...模块有两个必要条件: 必须有外部的封闭函数,该函数必须至少被调用一次 封闭函数必须返回至少一个内部函数,这样内部函数才能在私有作用域中形成闭包,并且可以访问或修改私有的状态 import 可以将一个模块的一个或多个...NodeJS 提供了对https 的支持,可以通过openssl 生成证书的方式大致是: openssl req -new -x509 -keyout key.pen -out cert.perm 使用证书的示例如下

    1K40

    深入理解nodejs中的异步编程

    nodejs采用了一个非常巧妙的办法,在nodejs中,任何回调函数中的第一个参数为错误对象,我们可以通过判断这个错误对象的存在与否,来进行相应的错误处理。...但是遗憾的是,如果我们需要依赖回调函数的返回值来进行下一步的操作的时候,就会陷入这个回调地狱。 叫回调地狱有点夸张了,但是也是从一方面反映了回调函数所存在的问题。...这样让我们的代码看起来非常的冗余。 那么有没有什么办法可以直接返回promise中resolve的结果呢? 答案就是await。...setTimeout(() => resolve('小马哥'), 5000) }) } 上面我们定义了一个logAsync函数,该函数返回一个Promise,因为该Promise内部使用了...async的特点 async会让所有后面接的函数都变成Promise,即使后面的函数没有显示的返回Promise。

    1.4K30

    深入浅出node中间件原理

    在NodeJS中,中间件主要是指封装http请求细节处理的方法。...我们目前看到的主流nodejs框架, 比如connect, koa, express, egg, nest等, 都离不开中间件的设计概念, 所以为了能让大家更深入的窥探nodejs世界, 我们就非常有比较研究中间件的实现原理...(res => { next() }) } 复制代码 还有一种中间件场景, 比如说日志中间件, 请求监控中间件, 它们会在业务处理前和处理后都会执行相关逻辑, 这个时候就要求我们需要能对next函数进行二次处理..., 我们可以将next的返回值包装成promise, 使得其在业务处理完成之后通过then回调来继续处理中间件逻辑....() } // 启动中间件 useApp() 复制代码 在koa2框架中, 中间件的实现方式也是将next()方法返回值封装为Promise对象,实现了其提出的洋葱圈模型,如下图所示: ?

    56120

    深入理解nodejs中的异步编程

    nodejs采用了一个非常巧妙的办法,在nodejs中,任何回调函数中的第一个参数为错误对象,我们可以通过判断这个错误对象的存在与否,来进行相应的错误处理。...但是遗憾的是,如果我们需要依赖回调函数的返回值来进行下一步的操作的时候,就会陷入这个回调地狱。 叫回调地狱有点夸张了,但是也是从一方面反映了回调函数所存在的问题。...这样让我们的代码看起来非常的冗余。 那么有没有什么办法可以直接返回promise中resolve的结果呢? 答案就是await。...setTimeout(() => resolve('小马哥'), 5000) }) } 上面我们定义了一个logAsync函数,该函数返回一个Promise,因为该Promise内部使用了...async的特点 async会让所有后面接的函数都变成Promise,即使后面的函数没有显示的返回Promise。

    1.3K21

    web前端面试都问什么-JS篇

    ;或者一个函数内部返回另一个匿名函数,这些都是闭包的应用。...1.无法中途退出循环,只能用return退出本次回调,进行下一次回调. 2.它总是返回 undefined值,即使你return了一个值。...如果有一个元素满足条件,则表达式返回true, 剩余的元素不会再执行检测 filter 过滤原始数组,返回新数组 map 对数组中的每个元素进行处理,返回新的数组 reduce 为数组提供累加器,合并为一个值...reduce() 方法对累加器和数组中的每个元素(从左到右)应用一个函数,最终合并为一个值。..., error); }); 上面代码中,getJSON方法返回一个 Promise 对象,如果该对象状态变为resolved,则会调用then方法指定的回调函数;如果异步操作抛出错误,状态就会变为rejected

    3.8K32

    为何面向手写代码常被吐槽,但其仍未动摇?

    如果只会 API 调用,哪怕它的实现很简单,也是不知道的,如果能在工作中多一些思考,对一些自己经常使用的东西多一些学习和思考,一方面能加深自己的理解、例如 Promise 的 resolve 函数不执行会发生什么...,之前在交流群上记得一个小伙伴问了一个问题,大致是关于 Node.js Stream 的 pipe 实现,正好对这块也感兴趣,看了 Node.js 相关源码也才有了这篇文章 Nodejs Stream...是可以链式调用的,对于值穿透的场景要做判断,如果不传,则返回一个函数,也就是将上个结果进行传递 行 {9} then 方法必须返回一个 promise 对象 行 {10}、{11} 、{12} 也是 then...} Promise/A+ 标准规定:如果 onFulfilled 或 onRejected 返回的是一个 x,那么它会以 [[Resolve]](promise2, x) 处理解析,我们定义解析的函数...const then = x.then; // [2.3.3.3] 如果 then 是函数(默认为是一个 promise),将 x 作为函数的作用域 this 调用之。

    82340

    多图详解不同环境下的EventLoop执行机制

    栈 比如我们日常函数的执行,实质上基于栈去操作。JS 中会存在一个调用栈,它会负责跟踪所有待执行的操作。 每当一个函数执行完成时,它就会从栈的顶部弹出。...其实这是一个非常简单的过程,代码中函数执行基于 stack 进行先进先出的一个过程。 调用栈 stack 负责跟踪要执行的所有操作。每当一个函数完成时,它就会从栈顶中弹出。...之后,会处理相关 Worker 中的任务。 其实这就是浏览器中完整的一次相关 EventLoop 的处理过程,它非常简单。...I/O 操作 我们都了解 NodeJs 是 JavaScript 脱离了浏览器 V8 的执行环境下的另一个 Runtime ,这也就意味着利用 NodeJS 我们可以进行 I/O 操作(比如从网络读取...上一次循环队列中,还未执行完毕的会在这个阶段进行执行。比如延迟到下一个 Loop 之中的 I/O 操作。

    64020

    探索异步迭代器在 Node.js 中的使用

    行 {2} 根据异步可迭代协议,可迭代对象必须要包含一个 Symbol.asyncIterator 属性,该属性是一个无参数的函数,返回可迭代对象本身,也就是下面代码中 SymbolAsyncIterator...行 {3} 如果迭代器对象完成,返回的 Promise 对象 done 属性设置为 true,遍历器也就结束了,变量 finished 是由 iterator 对象的 return() 方法被调用之后设置的...当我们调用 fs.createReadStream() 创建一个可读流对象时,对应的该方法内部会调用 ReadStream 构造函数 // https://github.com/nodejs/node/...Readable 原型上定义了 SymbolAsyncIterator 属性,该方法返回了一个由生成器函数创建的迭代器对象。...== null) { yield chunk; // 这里是关键,根据迭代器协议定义,迭代器对象要返回一个 next() 方法,使用 yield 返回了每一次的值 } else

    7.5K20

    JavaScript Event Loop

    事件循环是通过任务队列的机制进行协调的。一个事件循环中,可以有一个或多个任务队列,而每个任务都有一个任务源。 来自同一个任务源的任务任务必须放到同一个任务队列,不同源则被添加到不同的任务队列。...在事件循环期间的某个时刻,运行时会从最先进入队列的消息开始处理队列中的消息。被处理的消息会被移出队列,并作为输入参数来调用与之关联的函数。调用一个函数总是会为其创造一个新的栈帧。...函数的处理会一直进行到执行栈再次为空为止;然后事件循环将会处理队列中的下一个消息(如果还有的话)。 宏任务(macrotask) 上面说了不同源则被添加到不同的任务队列,宏任务就是一种任务源。...需要注意的是:Promise 构造函数中的代码是同步执行。 浏览器的事件循环执行机制 先说一下浏览器中的事件循环机制,浏览器与 Nodejs 事件循环机制是不太一样的。...而 setTimeout 的执行只是在内存中对图像属性进行改变,这个改变必须要等到下次浏览器重绘时才会被更新到屏幕上。

    1.3K20

    编写高质量可维护的代码:异步优化

    并且回调的概念不单单出现在 JavaScript,你也会在 Java 或者 C# 等后端语言中也能找到他的影子。 回调函数简单的说其实就是给另外一个寄主函数作为传参的函数。...在寄主函数执行完成或者执行到特定阶段之后触发调用回调函数并执行,然后把执行结果再返回给寄主函数的过程。...,并且可以把异步以链式的方式进行操作。...其实在 JQuery 中的 deferred 和它就有点像,都是采用回调函数的解决方案,都可以做链式调用,但是在 Promise 中增加了错误的 catch 方法可以更加方便的处理异常场景,并且它内置状态...让异步调用更加语义化,并且自动执行异步 异步业务中碰到的场景 回调地狱 在使用回调函数的时候我们可能会有这样的场景,B 需要在 A 的返回之后再继续调用,所以在这样有先后关系的时候就存在了一个叫回调地狱的问题了

    42520
    领券