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

函数式编程与JS异步编程、手写Promise

一、谈谈你是如何理解JS异步编程的,EventLoop、消息队列都是做什么的,什么是宏任务,什么是微任务? ? 1. 异步编程:回调函数、事件监听、发布/订阅、Promises对象 2....EventLoop是主线程"任务队列"中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)。...宏任务 Macrotasks 就是参与了事件循环的异步任务;微任务 Microtasks 就是没有参与事件循环的“异步”任务。...代码题 一、将下面异步代码使用Promise的方式改进 setTimeout(function () { var a = "111" setTimeout(function () {...// 再根据promise对象返回的结果 决定调用resolve 还是调用reject resolvePromise(promsie2, x, resolve, reject

98510

美团前端面试题整理_2023-02-28

然后当浏览器在解析到 script 标签时,会暂停构建 DOM,完成后才会暂停的地方重新开始。...像加载图片音乐之类占用资源大耗时久的任务,就是异步任务。...下面是我个人推荐的回答: 首先js 是单线程运行的,在代码执行的时候,通过将不同函数的执行上下文压入执行栈中来保证代码的有序执行 在执行同步代码的时候,如果遇到了异步事件,js 引擎并不会一直等待其返回结果...一旦执行栈为空,Event Loop 就会 Task 队列中拿出需要执行的代码并放入执行栈中执行,所以本质上来说 JS 中的异步还是同步行为 图片 console.log('script start'...3)Promise缺点 1、无法取消Promise,一旦新建它就会立即执行,无法中途取消。 2、如果设置回调函数Promise内部抛出的错误,不会反应到外部。

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

JavaScript: Event Loop 到 Promise (常见问题分析)

什么是 async 和 await async/await 使得异步代码看起来像同步代码(实际是阻塞了代码),一句话总结,async 函数就是 Generator 函数的语法糖,返回了一个 promise.resolve...不着急介绍 promise 的详情,首先我们最开始的同步和异步讲起: 一、同步和异步 1.1 同步 简单的理解 如果函数返回结果的时候,调用者能够拿到预期的结果(即使会等待但是依然能拿到预期的结果...console.log('synchronous'); //我们能立即得到 synchronous 1.2 异步 简单的理解 如果函数返回的时候,不能立即得到预期的结果,而是通过一定的手段得到的(比如回调函数...JS引擎:js引擎可以说是js虚拟机,负责解析js代码的解析和执行。...new promise 执行完毕,回调函数cb() 进入Event Queue。 执行 打印 script end; 主线程Event Queue读取回调函数 cb 并执行。

68630

JavaScript是如何工作的:事件循环和异步编程的崛起+ 5种使用 asyncawait 更好地编码方式!

例如,当 JavaScript 程序发出 Ajax 请求服务器获取一些数据时,在函数(“回调”)中设置“response”代码,JS引擎告诉宿主环境:"我现在要推迟执行,但当完成那个网络请求时,会返回一些数据...这主要是因为可以另一个浏览器窗口(例如iframe)接收 Promise 值,该窗口或框架具有自己的 Promise 值,与当前窗口或框架中的 Promise 值不同,所以该检查将无法识别 Promise...AsyncFunction 对象表示该函数中包含的代码的异步函数。 调用使用 async 声明函数时,它返回一个 Promise。...当这个函数返回一个值时,这个值只是一个普通值而已,这个函数内部将自动创建一个承诺,并使用函数返回的值进行解析。当这个函数抛出异常时,Promise 将被抛出的值拒绝。...使用 async 声明函数时可以包含一个 await 符号,await 暂停这个函数的执行并等待传递的 Promise解析完成,然后恢复这个函数的执行并返回解析后的值。

3.1K20

Node.js异步编程

同步API,异步API //路径拼接 const public = path.join(_ dirname, 'public') ; //通过返回值拿到 //请求地址解析 const url0bj =...同步API,异步API的区别(获取返回值) 同步API可以返回值中拿到API执行的结果,但是异步API是不可以的 //同步 function sum (n1, n2) { return nl...promise对象 在异步函数内部使用return关键字进行结果返回 结果会被包裹的promise对象中 return关键字代替了resolve方法 在异步函数内部使用throw关键字抛出程序异常...await promise await后面只能写promise对象,其他类型的API是不可以的 await关键字是暂停异步函数向下执行,直到promise返回结果 // 在普通函数定义前加上async...关键字, 普通函数就变成了异步函数 // 异步函数默认返回值是promise对象 Promise { undefined } // throw 抛出异常 async function fn() {

1.9K10

每天10个前端小知识 【Day 11】

而由于 JS 经常要操作 DOM ,就要涉及 JS 引擎线程和 GUI 渲染线程的通信,线程间通信代价是非常昂贵的,这也是造成 JS 操作 DOM 效率不高的原因。...浏览器的 HTML/CSS 的解析和渲染都属于 GUI渲染线程,所以和 JS 引擎线程是互斥、阻塞的。下面代码实际运行的角度分析浏览器解析和渲染的顺序,以及互相间的阻塞关系。...这让异步方法可以像同步方法那样返回值,但并不是立即返回最终执行结果,而是一个能代表未来出现的结果的promise对象 async/await es2017的新语法,async/await就是generator...async/await中的return/throw会代理自己返回Promise的resolve/reject,一个Promise的resolve/reject会使得await得到返回值或抛出异常。...如果方法内有await节点 async会返回一个{PromiseStatus: pending}的Promise(发生切换,异步等待Promise的执行结果)。

10910

美团前端面试题合集

3)Promise缺点1、无法取消Promise,一旦新建它就会立即执行,无法中途取消。2、如果设置回调函数Promise内部抛出的错误,不会反应到外部。...所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。语法上说,Promise 是一个对象,它可以获取异步操作的消息。...Promise的缺点:无法取消Promise,一旦新建它就会立即执行,无法中途取消。如果设置回调函数Promise内部抛出的错误,不会反应到外部。...总结: Promise 对象是异步编程的一种解决方案,最早由社区提出。Promise 是一个构造函数,接收一个函数作为参数,返回一个 Promise 实例。...当后端接收到 JSON 格式的字符串时,可以通过这个方法来将其解析为一个 js 数据结构,以此来进行数据的访问。

91740

校招前端二面面试题合集

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。语法上说,Promise 是一个对象,它可以获取异步操作的消息。...Promise的缺点:无法取消Promise,一旦新建它就会立即执行,无法中途取消。如果设置回调函数Promise内部抛出的错误,不会反应到外部。...总结: Promise 对象是异步编程的一种解决方案,最早由社区提出。Promise 是一个构造函数,接收一个函数作为参数,返回一个 Promise 实例。...,两者都是去异步加载外部的JS文件,不会阻塞DOM的解析(尽量使用异步加载)。...(3)针对DOM树、CSSOM树: 可以通过以下几种方式来减少渲染的时间:HTML文件的代码层级尽量不要太深使用语义化的标签,来避免标准语义化的特殊处理减少CSSD代码的层级,因为选择器是左向右进行解析

63810

JavaScript错误处理完全指南

接收一个 Promise 数组,并从所有解析中的 Promise 返回一个结果数组: const promise1 = Promise.resolve("All good!")...即使数组中只有一个 Promise 拒绝,Promise.all 也会返回失败; Promise.any 始终为我们提供第一个已解析Promise(如果存在于数组中),不管发生了什么拒绝。...} ] async/await 的错误处理 JavaScript 中的 async/await 表示异步函数,但是读者的角度来看,它们也拥有同步函数的所有 可读性。...异步生成器函数返回的迭代器对象也有一个 throw() 方法,非常像它的同步形式。...Node.js 中的异步错误处理:回调模式 对于异步代码,Node.js 强烈依赖两个习惯用法: 回调模式 事件发射器 在 回调模式 中,异步 Node.jsAPI 接收一个函数,该函数通过 事件循环

4.8K20

0到1实现Promise前言正文结束

前言 Promise大家一定都不陌生了,JavaScript异步流程最初的Callback,到Promise,到Generator,再到目前使用最多的Async/Await(如果对于这些不熟悉的可以参考我另一篇文章...+规范的同学肯定知道,then()方法返回的仍是一个Promise,并且返回Promise的resolve的值是上一个Promise的onFulfilled()函数或onRejected()函数返回值...如果在上一个Promise的then()方法回调函数的执行过程中发生了错误,那么会将其捕获到,并作为返回Promise的onRejected函数的参数传入。...让then()方法的回调函数总是异步调用 官方Promise实现的回调函数总是异步调用的: console.log('start'); let promise = new Promise((resolve...MyPromise.js MyPromise.stop = function() { return new Promise(function() {}); }; 复制代码 stop中返回一个永远执行

94730

js面试跳跳题二

如果 valueOf() 返回一个原始值,JS 将这个值转换为字符串(如果本身不是字符串的话),并返回这个字符串结果。 如果方法 toString() 存在,则调用它。...如果 toString() 返回一个原始值,JS 将这个值转换为字符串(如果本身不是字符串的话),并返回这个字符串结果。需要注意,原始值到字符串的转换。...声明里面的代码,Promise.resolve() 或者 Promise.reject()== 异步任务:主线程会先挂起(pending)异步任务,进入“任务队列”(task queue),在该异步任务返回结果的时候再根据一定规则去执行相应的回调...事件和回调函数 所谓"回调函数"(callback),就是那些会被主线程挂起来的代码。异步任务必须指定回调函数,当主线程开始执行异步任务,就是执行对应的回调函数。...async 函数和普通 函数没有什么不同,他只是表示这个函数里有异步操作的方法,并返回一个 Promise 对象 async function async1() { console.log("async1

15420

2022高频前端面试题合集之JavaScript篇(中)

parseInt("f") // 返回 NaN parseInt("f",16) // 返回15 二、parseInt 方法解析的运算过程 parseInt('101.55',10); // 以十进制解析...Promise 构造函数是同步执行还是异步执行,那么 then 方法呢?(字节) 参考答案: promise 构造函数是同步执行的,then 方法是异步执行,then 方法中的内容加入微任务中。...「调用栈」 调用栈是解析器(如浏览器中的的javascript解析器)的一种机制,可以在脚本调用多个函数时,跟踪每个函数在完成执行时应该返回控制的点。...然后执行所有已触发的异步任务,依次执行事件处理函数,直至执行完毕,然后跳至第二步,若没有需处理的异步任务中,则直接返回第二步,依次执行后续步骤; 最后返回第二步,继续检查MacroTask队列,依次执行后续步骤...; 如此往复,若所有异步任务处理完成,则结束; Promise 是一个微任务,主线程是一个宏任务,微任务队列会在宏任务后面执行 setTimeout 返回函数是一个新的宏任务,被放入到宏任务队列 所以

2.2K10

promise执行顺序面试题令我头秃,你能作对几道

(2);})promise.then(() => { console.log(3);})console.log(4);解析首先 Promise 新建后立即执行,所以会先输出 1,2, Promise.then...console.log('catch:', err);})解析resolve 函数Promise 对象的状态“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用...,并将异步操作的结果,作为参数传递出去;reject 函数Promise 对象的状态“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误...then 方法接受的参数是函数如果传递的并非是一个函数,它实际上会将其解释为 then(null),这就会导致前一个 Promise 的结果会穿透下面。...ajax1 、ajax2、ajax3 都是函数,只是这些函数执行后会返回一个 Promise,按题目的要求我们只要顺序执行这三个函数就好了,然后把结果放到 data 中,但是这些函数里都是异步操作,想要按顺序执行

41320

关于 ES6 中 Promise 的面试题

(4); 解析 首先 Promise 新建后立即执行,所以会先输出 1,2, Promise.then() 内部的代码在 当次 事件循环的 结尾 立刻执行 ,所以会继续输出4,最后输出3。...resolve 函数Promise 对象的状态“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去; reject...函数Promise 对象的状态“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。...then 方法接受的参数是函数如果传递的并非是一个函数,它实际上会将其解释为 then(null),这就会导致前一个 Promise 的结果会穿透下面。...首先 ajax1 、ajax2、ajax3 都是函数,只是这些函数执行后会返回一个 Promise,按题目的要求我们只要顺序执行这三个函数就好了,然后把结果放到 data 中,但是这些函数里都是异步操作

92520

阿里前端常考面试题

首先我们需要知道:DOM 引擎、JS 引擎 相互独立,但又工作在同一线程(主线程) JS 代码调用 DOM API 必须 挂起 JS 引擎、转换传入参数数据、激活 DOM 引擎,DOM 重绘后再转换可能有的返回值...Promise.resolve方法返回一个新的Promise对象,状态为fulfilled,其参数将会作为then方法中onResolved回调函数的参数,如果Promise.resolve方法不带参数...9、Promise.reject()同样返回一个新的Promise对象,状态为rejected,无论传入任何参数都将作为reject()的参数2)Promise优点①统一异步 APIPromise 的一个重要优点是它将逐渐被用作浏览器的异步...③Promise 与回调对比解决了回调地狱的问题,将异步操作以同步操作的流程表达出来。...3)Promise缺点1、无法取消Promise,一旦新建它就会立即执行,无法中途取消。2、如果设置回调函数Promise内部抛出的错误,不会反应到外部。

69020

promise执行顺序面试题令我头秃

(2);})promise.then(() => { console.log(3);})console.log(4);解析首先 Promise 新建后立即执行,所以会先输出 1,2, Promise.then...console.log('catch:', err);})解析resolve 函数Promise 对象的状态“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用...,并将异步操作的结果,作为参数传递出去;reject 函数Promise 对象的状态“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误...then 方法接受的参数是函数如果传递的并非是一个函数,它实际上会将其解释为 then(null),这就会导致前一个 Promise 的结果会穿透下面。...ajax1 、ajax2、ajax3 都是函数,只是这些函数执行后会返回一个 Promise,按题目的要求我们只要顺序执行这三个函数就好了,然后把结果放到 data 中,但是这些函数里都是异步操作,想要按顺序执行

51420

JavaScript 编程精解 中文第三版 十一、异步编程

我们可以使用一个小例子来比较同步和异步编程:一个网络获取两个资源然后合并结果的程序。 在同步环境中,只有在请求函数完成工作后,它才返回,执行此任务的最简单方法是逐个创建请求。...两种重要的 JavaScript 编程平台(浏览器和 Node.js)都可能需要一段时间的异步操作,不是依赖线程。...它返回另一个Promise,它解析处理器函数返回的值,或者如果返回Promise,则等待该Promise,然后解析为结果。 将Promise视为一种手段,将值转化为异步现实,是有用处的。...它以这种方式工作,不是使用resolve方法,这样只有创建Promise的代码才能解析它。 这就是为readStorage函数创建基于Promise的接口的方式。...方法也可以通过在名称前面编写async来做成异步的。 当调用这样的函数或方法时,它返回一个Promise。 只要主体返回了某些东西,这个Promise解析了。

2.6K20

实现Promise,有手就行巨详细,不看血亏

的then方法是异步的,应该先打印111,然后再执行then方法,现在的实现的_Promise是同步的,先执行then再执行打印111,因此需要修改一下,利用定时器模拟异步 _Promise.prototype.then...回调返回 // 失败执行的函数 function reject(season) { // 规范规定,只能从pending变成fulfilled或者pending变成rejected /...(比如,定时器)的回调里,而又因为js的事件机制,不会等到这个异步函数执行完成再去继续往下执行,他回将这个异步函数的回调放到任务队列里,等主线程执行栈执行完成了再去执行这个任务队列里面的回调,因此,如果...resolve方法如果在异步函数里,js就会将他放入任务队列,然后继续往下执行 因此,当js执行完 _Promise.executor后,继续往下执行(遇到then(),这里注意,是遇到then(),加了小括号...,是会立即执行这个then的,然后就会执行then函数,)这时候进入then,当前的状态因为没有被修改(因为那个resolve回调函数被放到任务队列了,还在等着,并没有执行),还是pending,上面实现的

64110

关于 ES6 中 Promise 的面试题

((err) => { console.log('catch:', err); }) 解析 resolve 函数Promise 对象的状态“未完成”变为“成功”(即从 pending 变为...resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去; reject 函数Promise 对象的状态“未完成”变为“失败”(即从 pending 变为 rejected...then 方法接受的参数是函数如果传递的并非是一个函数,它实际上会将其解释为 then(null),这就会导致前一个 Promise 的结果会穿透下面。...首先 ajax1 、ajax2、ajax3 都是函数,只是这些函数执行后会返回一个 Promise,按题目的要求我们只要顺序执行这三个函数就好了,然后把结果放到 data 中,但是这些函数里都是异步操作...这道题就是考用 Promise 控制异步流程,我们要想办法,让这些函数,一个执行完之后,再执行下一个,看答案吧。

1.2K10

JavaScript执行机制

queueMicrotask(() => { /* 微任务中将运行的代码 */});微任务函数本身没有参数,也返回值。...注意Promise中Executor不属于异步任务,而是属于同步任务,在主代码块执行时一并顺序执行,Promise.then则是在执行过程中产生的微任务,会被事件处理线程注册到微任务的Event Table...await 操作符用于等待一个Promise 对象。它只能在异步函数 async function 中使用。...await表达式会暂停整个async函数的执行进程并出让其控制权,只有当其等待的基于promise异步操作被兑现或被拒绝之后才会恢复进程。promise的解决值会被当作该await表达式的返回值。...Node.js采用V8作为js解析引擎,I/O处理方面使用了自己设计的libuv,libuv是一个基于事件驱动的跨平台抽象层,封装了不同操作系统一些底层特性,对外提供统一的API,事件循环机制也是它里面的实现

32222
领券