手写 Promise】的更多相关文章

基于ES6语法手写promise A+ 规范,源码实现 class Promise { constructor(excutorCallBack) { this.status = 'pending'; this.value = undefined; this.fulfilledAry = []; this.rejectedAry = []; //=>执行EXCUTOR(异常捕获) let resolveFn = result => { let timer = setTimeout(() =>…
写在前面: 在目前的前端分开中,我们对于异步方法的使用越来越频繁,那么如果处理异步方法的返回结果,如果优雅的进行异步处理对于一个合格的前端开发者而言就显得尤为重要,其中在面试中被问道最多的就是对Promise方法的掌握情况,本章将和大家一起分析和完成一个Promise方法,希望对你的学习有一定的帮助. 了解Promise 既然我们是要模仿ES6的Promise,那我们必然要知道这个方法主要都是用来干什么的,有哪些参数,有什么特性,为什么要使用Promise及如何使用等等. 为什么要使用它? 1.…
目录 概要 博客思路 API的特性与手写源码 构造函数 then catch Promise.resolved Promise.rejected Promise.all Promise.race 概要 本文主要介绍了Promise上定义的api的特性,以及手写如何实现这些特性.目的是把学习过程中的产出以博客的方式输出,巩固知识,也便于之后复习 博客思路 mdn上搜索Promise,了解类和api的定义: 定义了哪些属性,分别代表什么含义 api需要传什么参数,返回什么值,可能抛出什么异常 看官方…
1. Promise中then()方法返回来的结果或者规律 我们知道 promise 的 then 方法返回来的结果值[result]是由: 它指定的回调函数的结果决定的 2.比如说下面这一段代码 let p = new Promise((resolve, reject) => { resolve('ok'); }) const result= p.then(res => { alert(res) }, err => { console.log(err) }) 也就是说result的结果…
前端面试题之Promise问题 前言 在我们日常开发中会遇到很多异步的情况,比如涉及到 网络请求(ajax,axios等),定时器这些,对于这些异步操作我们如果需要拿到他们操作后的结果,就需要使用到回调函数.拿请求来说,如果我们需要拿到请求回来的数据我们就需要利用回调函数(见代码片段1),以下所有的请求都是使用jQuery的ajax模拟. 点击查看代码片段1 // 代码片段1 $.ajax({ url: 'url', type: 'post', data: { 参数1: 值1, 参数2: 值2…
我们工作中免不了运用promise用来解决异步回调问题.平时用的很多库或者插件都运用了promise 例如axios.fetch等等.但是你知道promise是咋写出来的呢? 别怕-这里有本promisesA+规范,便宜点10元卖给你了.   ERvaA3z.png 1.Promise 的声明 首先呢,promise肯定是一个类,我们就用class来声明. • 由于 new Promise((resolve, reject)=>{}) ,所以传入一个参数(函数),秘籍里叫他executor,传入…
话不多说,直接上代码 通过ES5的模块化封装,向外暴露一个属性 (function(window){ const PENDING = 'pending'; const RESOLVED = 'fulfilled' const REJECTED = 'rejected' function MyPromise(excutor){ const self = this;   //保存Promise对象,防止异步执行时,拿不到数据和方法,必要 self.value = undefined; self.st…
Promise的使用相比大家已经孰能生巧了,我这里就不赘述了 先说说我写的Promise的问题吧,无法实现宏任务和微任务里的正确执行(也就是在Promise里面写setTimeout,setInterval的话,输出顺序会有问题),其他的API(catch.finally.race.all)有兴趣的话,大家可以斟酌补充. 开始贴代码: // 定义一个Promise类function Promise(fn){ // 回调队列 存放的所有的.then里面的回调 this.callbacks = []…
/* * pending:初始化成功 * fulfilled:成功 * rejected:失败 * */ function Promise(executor) {// 执行器 this.status = 'pending'; this.value = undefined; this.reason = undefined; this.fulfilledCallback = []; this.rejectCallback = []; let resolve = (value)=>{ if(this.…
/* * pending:初始化成功 * fulfilled:成功 * rejected:失败 * */ function Promise(cback){ this.status = 'pending'; this.value = undefined this.reason = undefined this.fulfilledCallback = undefined; this.rejectCallback = undefined; let resolve = (value)=>{ if(thi…
在上一章节中我们了解了 Promise 的一些易错点,在这一章节中,我们会通过手写一个符合 Promise/A+ 规范的 Promise 来深入理解它,并且手写 Promise 也是一道大厂常考题,在进入正题之前,推荐各位阅读一下 Promise/A+ 规范,这样才能更好地理解这个章节的代码. 实现一个简易版 Promise 在完成符合 Promise/A+ 规范的代码之前,我们可以先来实现一个简易版 Promise,因为在面试中,如果你能实现出一个简易版的 Promise 基本可以过关了. 那…
我的promise能实现什么? 1:解决回调地狱,实现异步 2:可以链式调用,可以嵌套调用 3:有等待态到成功态的方法,有等待态到失败态的方法 4:可以衍生出周边的方法,如Promise.resolve(),Promise.reject(),Promise.prototype.then(),Promise.prototype.catch(),Promise.all() // 所有的完成 5. 可以根据自己的需求调节自己的promise let PromiseA = require('./Prom…
异步编程是前端开发者必需的技能,过去管理异步的主要机制都是通过函数回调,然而会出现像“回调地狱”这样的问题.为了更好的管理回调,ES6 增加了一个新的特性 Promise.Promise 是 ES7 中async/await 语法的基础,是 JavaScript 中处理异步的标准形式,现实开发中基本离不开 Promise 了.我们接下来会根据 Promises/A+ 规范自己实现一个 Promise. 完整的代码可以点击我的 github 进行查看,如果你喜欢,欢迎 star,如果发现有问题或者…
上一篇文章中,我们介绍了Promise的基本使用,在这篇文章中,我们试着自己来写一个Promise,主要是学习Promise的内部机制,学习它的编程思想. !!!备注:本文写的不好,仅供自己学习之用,具体的实现过程建议看下面的参考文章.所以本文没有发布到博客园首页和其他地方 Promise API分析 正常使用方法 我们来看一个正常的使用: var p=new Promise(function(resolve,rejcet){ setTimeout(function(){ if(true){ r…
Promise是什么 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息.Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理. Promise是处理异步编码的一个解决方案,在Promise出现以前,异步代码的编写都是通过回调函数来处理的,回调函数本身没有任何问题,只是当多次异步回调有逻辑关系时就会变得复杂: const fs = require('fs')…
史上最完整的promise源码实现,哈哈,之所以用这个标题,是因为开始用的标题<手写promise源码>不被收录 promise自我介绍 promise : "君子一诺千金,承诺的事情一定会去执行" promise的使用场景 使用promise能够有效的解决js异步回调地狱问题 能够将业务逻辑与数据处理分隔开使代码更优雅,方便阅读,更有利于代码维护 promise的基本用法 function promiseTest() { let promise = new Promise…
手写 Promise 实现 Promise的基本使用 Promise定义及用法详情文档:Promise MAD文档 function testPromise(param) { return new Promise((resolve, reject) => { setTimeout(() => { params ? resolve('resolve:' + param) : reject('reject:' + param) }, 1000) }) } 我们能够通过 .then 方法来获取执行成…
Promise太重要了,可以说是改变了JavaScript开发体验重要内容之一.而Promise也可以说是现代Javascript中极为重要的核心概念,所以理解Promise/A+规范,理解Promise的实现,手写Promise就显得格外重要.如果要聊Promise就要从回调函数聊到回调地狱,再聊到同步异步,最终聊到Promise.async await.但是我们这篇文章,目的是手写Promise,这些前置知识如果大家不了解的话,希望可以去补充一下.那你可能会说了,我他妈不懂你在说啥,我就是想…
最近在复习面试中常见的JS手写函数,顺便进行代码注释和总结,方便自己回顾也加深记,内容也会陆陆续续进行补充和改善. 一.手写深拷贝 <script> const obj1 = { name: 'Leise', age: 23, address: { country: 'China', city: 'Guanzhou' } } const obj2 = deepClone(obj1) obj2.address.city = 'Hangzhou' console.log(obj1.address.…
由浅入深,从掌握Promise的基本使用到手写Promise 前言 在ES6之前,对于一些异步任务的处理始终没有很好的方案可以解决,处理异步的方案可谓是十分混乱,在业务需求下异步请求的套用,就形成了回调地狱,严重影响代码的阅读性.而Promise的出现,给我们统一了规范,解决了之前处理异步任务的许多痛点,并且它友好的使用方式,使之成为了JavaScript一大重点,同时也是面试的高频问点,下面就一起来全面认识一下Promise吧. 1.什么是Promise? 如果我们想在一个异步请求之后,拿到请…
手写一款符合Promise/A+规范的Promise 长篇预警!有点长,可以选择性观看.如果对Promise源码不是很清楚,还是推荐从头看,相信你认真从头看到尾,并且去实际操作了,肯定会有收获的.主要是代码部分有点多,不过好多都是重复的,不必担心 Promise的一些用法在此不多赘述,本篇主要带领你手写一个Promise源码,学完你就会发现:Promise没有你想象中的那么难 本篇大概分为以下步骤 实现简单的同步Promise 增加异步功能 增加链式调用then 增加catch finally方…
实现 new 方法 /* * 1.创建一个空对象 * 2.链接到原型 * 3.绑定this值 * 4.返回新对象 */ // 第一种实现 function createNew() { let obj = {} // 1.创建一个空对象 let constructor = [].shift.call(arguments) // let [constructor,...args] = [...arguments] obj.__proto__ = constructor.prototype // 2.…
实现防抖函数(debounce) 防抖函数原理:在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时. 那么与节流函数的区别直接看这个动画实现即可. 手写简化版: // 防抖函数 const debounce = (fn, delay) => { let timer = null; return (...args) => { clearTimeout(timer); timer = setTimeout(() => { fn.apply(this, args); }, del…
几道JS代码手写面试题   (1) 高阶段函数实现AOP(面向切面编程)    Function.prototype.before = function (beforefn) {        let _self = this; // 缓存原函数的引用        return function () { // 代理函数            beforefn.apply(this, arguments); // 执行前置函数            return _self.apply(thi…
前言 我们经常会遇到这样的事情:有时候我们找到了一个库,但是这个库是用 TypeScript 写的,但是我们想在 C# 调用,于是我们需要设法将原来的 TypeScript 类型声明翻译成 C# 的代码,然后如果是 UI 组件的话,我们需要将其封装到一个 WebView 里面,然后通过 JavaScript 和 C# 的互操作功能来调用该组件的各种方法,支持该组件的各种事件等等. 但是这是一个苦力活,尤其是类型翻译这一步. 这个是我最近在帮助维护一个开源 UWP 项目 monaco-editor…
挤一下: 一开始以为没有多少人用就没建群,但是加我的人太多了,好多问题都是重复的,所以建个群大家互相沟通交流方便点,但是建的有点晚,错过了好多人所以群里人有点少,QQ群: 157216616 小提示 这个框架权限是由前端控制的,如果不需要这个模式,可以看我另外一个全栈CMS项目,后台使用的是node框架egg.js+mysql,那个的权限是由后台返回有权限的路由,前端拿到路由后和前端路由表做筛选,得出最终的路由表生成菜单,好处是角色和角色所拥有的权限路由是动态的后台可随时编辑配置的,两种模式按需…
前言 现在很多大厂面试前端都会要求能够手动的写出一个Promise,所以这里整理了一份手写的Promise. 绝对详细,功能绝对强大.如果你不了解Promise的基本使用,那么本篇文章可能不太适合你,如果你对Promise有过一些了解,那么这篇文章绝对是你进阶的好帮手. 除开catch()以及finally()和allSettled接口没实现之外,其他的所有原生Promise支持的功能此手写的Promise都支持. 书写Promise的难度其实就在于then()方法的链式调用以及值穿透传递,其他…
上一篇文章我们分析了Redux-Thunk的源码,可以看到他的代码非常简单,只是让dispatch可以处理函数类型的action,其作者也承认对于复杂场景,Redux-Thunk并不适用,还推荐了Redux-Saga来处理复杂副作用.本文要讲的就是Redux-Saga,这个也是我在实际工作中使用最多的Redux异步解决方案.Redux-Saga比Redux-Thunk复杂得多,而且他整个异步流程都使用Generator来处理,Generator也是我们这篇文章的前置知识,如果你对Generato…
用Node.js写一个web服务器,我前面已经写过两篇文章了: 第一篇是不使用任何框架也能搭建一个web服务器,主要是熟悉Node.js原生API的使用:使用Node.js原生API写一个web服务器 第二篇文章是看了Express的基本用法,更主要的是看了下他的源码:手写Express.js源码 Express的源码还是比较复杂的,自带了路由处理和静态资源支持等等功能,功能比较全面.与之相比,本文要讲的Koa就简洁多了,Koa虽然是Express的原班人马写的,但是设计思路却不一样.Expre…
上一篇文章我们讲了Koa的基本架构,可以看到Koa的基本架构只有中间件内核,并没有其他功能,路由功能也没有.要实现路由功能我们必须引入第三方中间件,本文要讲的路由中间件是@koa/router,这个中间件是挂在Koa官方名下的,他跟另一个中间件koa-router名字很像.其实@koa/router是fork的koa-router,因为koa-router的作者很多年没维护了,所以Koa官方将它fork到了自己名下进行维护.这篇文章我们还是老套路,先写一个@koa/router的简单例子,然后自…