关于promise:一篇搞定-Promise

一、Promise是什么在 JavaScript 中,Promise 是一种解决异步操作的形式。Promise 能够让咱们更加优雅地解决异步操作,而不须要应用回调函数嵌套。 ● Promise 是一门新的技术(ES6 标准),是 JS 中进行异步编程的新解决方案(旧计划是单纯应用回调函数,容易造成回调天堂) ● 常见异步操作:①fs 文件操作 ②数据库操作 ③Ajax ④定时器 ● 具体表白: 从语法上看:Promise是一个构造函数 (本人身上有all、reject、resolve这几个办法,原型上有then、catch等办法)从性能上看:promise对象用来封装一个异步操作并能够获取其胜利/失败的后果值二、创立 Promise创立一个 Promise 非常简单,只须要应用 Promise 构造函数即可。Promise 构造函数承受一个函数作为参数,这个函数叫做执行器函数(executor function)。执行器函数有两个参数:resolve 和 reject。当异步操作胜利时,调用 resolve,并传递后果值作为参数;当异步操作失败时,调用 reject,并传递谬误对象作为参数。 const promise = new Promise(function(resolve, reject) { // ... some code if (/* 异步操作胜利 */){ resolve(value); } else { reject(reason); }});三、应用 Promise应用 Promise 有两种形式:then 办法和 catch 办法。 1.then 办法then 办法用于注册 Promise 胜利时的回调函数。当 Promise 胜利时,then 办法会被调用,并传递 Promise 胜利时的后果值作为参数。 ...

March 8, 2023 · 5 min · jiezi

关于promise:使用Promiserace实现控制并发

之前做过一个 Node.js实现分片上传 的性能。过后前端采纳文件切片后并发上传,大大提高了上传的速度,应用Promise.race()治理并发池,无效防止浏览器内存耗尽。当初的问题:Node.js服务端合并大文件分片 内存耗尽导致服务重启 服务端代码const ws = fs.createWriteStream(`${target}/${filename}`); // 创立将要写入文件分片的流const bufferList = fs.readdirSync(`${STATIC_TEMPORARY}/${filename}`); // 读取到分片文件名的列表[1,2,3...] 每个分片1M大小// 2. 不会阻塞EventLoopbufferList.forEach((hash, index) => { fs.readFile(`${STATIC_TEMPORARY}/${filename}/${index}`, (err, data) => { ws.write(data); });});服务器配置:RAM:1024MB 1vCPU (运行了一些其余服务) 测试发现只有上传的文件超过300M,在合并分片时就会导致内存耗尽服务重启,根本无法实现分片合并。 解决方案:能不能在循环中管制读取文件的并发数呢?这样就不会有大量文件同时读取到内存中导致服务解体了。 尝试像前端那样应用 Promise.race 管制: const ws = fs.createWriteStream(`${target}/${filename}`); // 创立将要写入文件分片的流const bufferList = fs.readdirSync(`${STATIC_TEMPORARY}/${filename}`); // 读取到分片文件名的列表[1,2,3...] 每个分片1M大小// Promise.race 并发管制const pool = [];let finish = 0; // 曾经写入实现的分片数量// 应用Promise包裹读取文件的异步操作const PR = (index) => { return new Promise((resolve) => { fs.readFile(`${STATIC_TEMPORARY}/${filename}/${index}`, (err, data) => { ws.write(data) resolve({}); }); });};(async function easyRead() { for (let i = 0; i < bufferList.length; i ++) { const task = PR(i).then(val => { finish+=1 const index = pool.findIndex(t => t === task); pool.splice(index); if (finish === bufferList.length) { ws.close(); } }); pool.push(task); if (pool.length === 1) { // 这里并发数量只能是1 否则分片写入是乱序的 格局会被损坏 await Promise.race(pool); } }})()这时神奇的事件就产生了,咱们在for循环中应用了Promise.race()管制了同一时间读入到内存中的文件数量。 ...

September 6, 2022 · 1 min · jiezi

关于promise:取消一个promise

场景:发送多个申请后,当回来的数据要渲染到页面时,DOM元素被销毁了,此时如果要渲染就会报错比方 react 在 useEffect 中申请的数据时,组件销毁 useEffect(() => { let dataPromise = new Promise(...); let data = dataPromise().then(); // TODO 接下来解决 data,此时本组件可能曾经销毁了,dom 也不存在了,所以须要在上面对 Promise 进行中断 return (() => { // TODO 组件销毁时,对 dataPromise 进行中断或勾销 }) });能够对生成的 Promise 对象进行再一次包装,返回一个新的 Promise 对象,而新的对象上被咱们减少了 cancel 办法,用于勾销。这里的原理就是在 cancel 办法外面去阻止 Promise 对象执行 then()办法。 function getPromiseWithCancel(originPromise) { let cancel = (v) => {}; let isCancel = false; const cancelPromise = new Promise(function (resolve, reject) { cancel = e => { isCancel = true; reject(e); }; }); const groupPromise = Promise.race([originPromise, cancelPromise]) .catch(e => { if (isCancel) { // 被动勾销时,不触发外层的 catch return new Promise(() => {}); } else { return Promise.reject(e); } }); return Object.assign(groupPromise, { cancel });}// 应用如下const originPromise = axios.get(url);const promiseWithCancel = getPromiseWithCancel(originPromise);promiseWithCancel.then((data) => { console.log('渲染数据', data);});promiseWithCancel.cancel(); // 勾销 Promise,将不会再进入 then() 渲染数据

August 22, 2022 · 1 min · jiezi

关于promise:遵循PromisesA规范深入分析Promise实现细节-通过872测试样例

前言本周写文的外围为 Promise ,Promise 大家应该都特地相熟了,Promise 是异步编程的一种解决方案,宽泛用在日常编程中。本周小包将围绕 Promise 源码手写进行写文,源码手写初步打算应用三篇文章实现—— 手写 Promise 之根底篇,手写 Promise 之 resolvePromise 篇,手写 Promise 之静态方法篇。 Promises/A+ 标准是 Promise 的实现准则,因而 Promise 手写系列将遵循 Promises/A+ 标准的思路,以案例和发问形式层层深刻,一步一步实现 Promise 封装。 学习本文,你能播种: 了解 Promise A+标准 了解什么是 Promise 的值穿透、Promise 链式调用机制、Promise 注册多个 then 办法等。 把握 Promise 源码编写全过程 把握公布订阅模式在 Promise 源码编写中的应用根底铺垫Promise 必然处于下列三种状态之一: Pending 期待态: 初始状态,不是胜利或失败状态。Fulfilled 实现态: 意味着操作胜利实现。Rejected 失败态: 意味着操作成功失败。当 promise 处于 Pending 状态时,能够转变为 Fulfilled 或者 Rejected当 promise 处于 Fulfilled 或 Rejected 时,状态不能再产生扭转 那什么会触发 promise 中状态的扭转呐?咱们来看几个栗子: // p1 什么都不执行且传入空函数const p1 = new Promise(() => {});console.log("p1: ", p1);// p2 执行 resolveconst p2 = new Promise((resolve, reject) => { resolve("success");});console.log("p2: ", p2);// p3 执行 rejectconst p3 = new Promise((resolve, reject) => { reject("fail");});console.log("p3: ", p3);// p4 抛出谬误const p4 = new Promise((resolve, reject) => { throw Error("error");});console.log("p4: ", p4);// p5 先执行 resolve 后执行 rejectconst p5 = new Promise((resolve, reject) => { resolve("success"); reject("fail");});console.log("p5: ", p5);// p6 什么都不执行且不传参const p6 = new Promise();console.log("p6: ", p6);复制代码咱们来看一下输入后果: ...

March 3, 2022 · 10 min · jiezi

关于promise:Promise理解看了又看

Promise 哪些 API 波及了微工作?Promise 中只有波及到状态变更后才须要被执行的回调才算是微工作,比如说 then、 catch 、finally ,其余所有的代码执行都是宏工作(同步执行)。上图中蓝色为同步执行,黄色为异步执行(丢到微工作队列中)。 这些微工作何时被退出微工作队列?这个问题咱们依据 ecma 标准来看: 如果此时 Promise 状态为 pending,那么胜利或失败的回调会别离被退出至 [[PromiseFulfillReactions]] 和 [[PromiseRejectReactions]] 中。如果你看过手写 Promise 的代码的话,应该能发现有两个数组存储这些回调函数。如果此时 Promise 状态为非 pending 时,回调会成为 Promise Jobs,也就是微工作。同一个 then,不同的微工作执行高级Promise.resolve() .then(() => { console.log("then1"); Promise.resolve().then(() => { console.log("then1-1"); }); }) .then(() => { console.log("then2"); }); 尽管 then 是同步执行,并且状态也曾经变更。但这并不代表每次遇到 then 时咱们都须要把它的回调丢入微工作队列中,而是期待 then 的回调执行结束后再依据状况执行对应操作。 基于此,咱们能够得出第一个论断:链式调用中,只有前一个 then 的回调执行结束后,跟着的 then 中的回调才会被退出至微工作队列。 中级大家都晓得了 Promise resolve 后,跟着的 then 中的回调会马上进入微工作队列。 那么以下代码你认为的输入会是什么? let p = Promise.resolve();p.then(() => { console.log("then1"); Promise.resolve().then(() => { console.log("then1-1"); });}).then(() => { console.log("then1-2");});p.then(() => { console.log("then2");}); 依照一开始的认知咱们不难得出 then2 会在 then1-1 后输入,然而理论状况却是相同的。 ...

February 21, 2022 · 2 min · jiezi

关于promise:Promise

Promise理解// Promise承受的参数是函数模式的// resolve(解决) 函数类型的参数 // reject(回绝) 函数类型的参数const p = new Promise((resolve,reject) => { let num = Math.round((Math.random() * 100)) if(num > 50) { resolve(num) // 能够将Promise对象(下面的 p)的状态设置为胜利 }else { reject(num) // 能够将Promise对象(下面的 p)的状态设置为失败 }})p.then((num) => { console.log('胜利了',num) // 如何中断Peomise // return new Promise(() => {)},(num) => { console.log('失败了',num)})// console.log(p) 会有一个Promise实例,下面有两个属性PromiseState1. pending 未决定的2. rejected 失败3. resolve/fulfilled 胜利PromiseResult保留着对象胜利或者失败的后果只有以下两个能够操作这个后果1. resolve2. reject手写Promise代码function Promise(excutor) { // 增加两个默认属性 this.PromiseState = 'pending' this.PromiseResult = null // 定义一个回调应用 this.callbacks = [] // 函数外面的this指向window,所以保留下 const that = this; // resolve函数 function resolve(data) { // PromiseState只能批改一次,不是pending状态间接retrun if(that.PromiseState !== 'pending') return // 1.批改对象的状态(PromiseState) that.PromiseState = 'fulfilled' // 2.批改对象后果值(PromiseResult) that.PromiseResult = data // 调用胜利函数 // 这个定时器为了体现异步 setTimeout(() => { that.callbacks.forEach(element => { element.onResolved(data) }); }) } // reject函数 function reject(data) { // PromiseState只能批改一次,不是pending状态间接retrun if(that.PromiseState !== 'pending') return // 1.批改对象的状态(PromiseState) that.PromiseState = 'rejected' // 2.批改对象后果值(PromiseResult) that.PromiseResult = data // 调用胜利函数 // 这个定时器为了体现异步 setTimeout(() => { that.callbacks.forEach(element => { element.onRejected(data) }); }) } // 兼容 throw 抛出异样 try { // 同步调用 《执行器函数》 excutor(resolve,reject) }catch(err) { reject(err) }}// 增加then办法Promise.prototype.then = function (onResolved,onRejected) { const that = this if(typeof onRejected !== 'function') { onRejected = error => { throw error } } if(typeof onResolved !== 'function') { onResolved = value => value } return new Promise((resolve,reject) => { // 封装函数 function callback(type) { try{ // 获取回调函数的执行后果 let result = type(that.PromiseResult) // 判断以后数据是不是一个Promise if(result instanceof Promise) { // 如果是,那必定能够调用then办法 result.then((val) => { resolve(val) },(err) => { reject(err) }) }else { // 如果不是,间接返回后果即可 resolve(result) } }catch(err){ reject(err) } } if(this.PromiseState === 'fulfilled') { // 这个定时器为了体现异步 setTimeout(() => { callback(onResolved) }) } if(this.PromiseState === 'rejected') { // 这个定时器为了体现异步 setTimeout(() => { callback(onRejected) }) } if(this.PromiseState === 'pending') { this.callbacks.push({ onResolved: function() { callback(onResolved) }, onRejected: function() { callback(onRejected) } }) } })}Promise.prototype.catch = function(onRejected) { return this.then(undefined,onRejected)}Promise.resolve = function(value) { return new Promise((resolve,reject) => { if(value instanceof Promise) { // 如果是,那必定能够调用then办法 value.then((val) => { resolve(val) },(err) => { reject(err) }) }else { // 如果不是,间接返回后果即可 resolve(value) } })}Promise.reject = function(error) { return new Promise((resolve,reject) => { reject(error) })}Promise.all = function(promises) { return new Promise((resolve,reject) => { // 申明一个变量来判断数组中是不是都执行胜利了 let count = 0 let arr = [] for(let i = 0;i < promises.length;i++) { promises[i].then(val => { count++; arr[i] = val // 当所有都执行成了,就返回胜利 if(count === promises.length){ resolve(arr) } },err => { reject(err) }) } })}Promise.race = function(promises) { return new Promise((resolve,reject) => { // 申明一个变量来判断数组中是不是都执行胜利了 for(let i = 0;i < promises.length;i++) { promises[i].then(val => { resolve(val) },err => { reject(err) }) } })}手写Promise代码-Class版本class Promise { // 构造方法 constructor(excutor) { // 增加两个默认属性 this.PromiseState = 'pending' this.PromiseResult = null // 定义一个回调应用 this.callbacks = [] // 函数外面的this指向window,所以保留下 const that = this; // resolve函数 function resolve(data) { // PromiseState只能批改一次,不是pending状态间接retrun if(that.PromiseState !== 'pending') return // 1.批改对象的状态(PromiseState) that.PromiseState = 'fulfilled' // 2.批改对象后果值(PromiseResult) that.PromiseResult = data // 调用胜利函数 // 这个定时器为了体现异步 setTimeout(() => { that.callbacks.forEach(element => { element.onResolved(data) }); }) } // reject函数 function reject(data) { // PromiseState只能批改一次,不是pending状态间接retrun if(that.PromiseState !== 'pending') return // 1.批改对象的状态(PromiseState) that.PromiseState = 'rejected' // 2.批改对象后果值(PromiseResult) that.PromiseResult = data // 调用胜利函数 // 这个定时器为了体现异步 setTimeout(() => { that.callbacks.forEach(element => { element.onRejected(data) }); }) } // 兼容 throw 抛出异样 try { // 同步调用 《执行器函数》 excutor(resolve,reject) }catch(err) { reject(err) } } then(onResolved,onRejected) { const that = this if(typeof onRejected !== 'function') { onRejected = error => { throw error } } if(typeof onResolved !== 'function') { onResolved = value => value } return new Promise((resolve,reject) => { // 封装函数 function callback(type) { try{ // 获取回调函数的执行后果 let result = type(that.PromiseResult) // 判断以后数据是不是一个Promise if(result instanceof Promise) { // 如果是,那必定能够调用then办法 result.then((val) => { resolve(val) },(err) => { reject(err) }) }else { // 如果不是,间接返回后果即可 resolve(result) } }catch(err){ reject(err) } } if(this.PromiseState === 'fulfilled') { // 这个定时器为了体现异步 setTimeout(() => { callback(onResolved) }) } if(this.PromiseState === 'rejected') { // 这个定时器为了体现异步 setTimeout(() => { callback(onRejected) }) } if(this.PromiseState === 'pending') { this.callbacks.push({ onResolved: function() { callback(onResolved) }, onRejected: function() { callback(onRejected) } }) } }) } catch(onResolved,onRejected) { return this.then(undefined,onRejected) } static resolve = function(value) { return new Promise((resolve,reject) => { if(value instanceof Promise) { // 如果是,那必定能够调用then办法 value.then((val) => { resolve(val) },(err) => { reject(err) }) }else { // 如果不是,间接返回后果即可 resolve(value) } }) } static reject (error) { return new Promise((resolve,reject) => { reject(error) }) } static all (promises) { return new Promise((resolve,reject) => { // 申明一个变量来判断数组中是不是都执行胜利了 let count = 0 let arr = [] for(let i = 0;i < promises.length;i++) { promises[i].then(val => { count++; arr[i] = val // 当所有都执行成了,就返回胜利 if(count === promises.length){ resolve(arr) } },err => { reject(err) }) } }) } static race (promises) { return new Promise((resolve,reject) => { // 申明一个变量来判断数组中是不是都执行胜利了 for(let i = 0;i < promises.length;i++) { promises[i].then(val => { resolve(val) },err => { reject(err) }) } }) }}

January 28, 2022 · 4 min · jiezi

关于promise:PromiseA规范

promiseA+ 标准常见术语promise,一种约定,是一个有then办法的对象或者函数,行为遵循本标准thenable,一个有then办法的对象或者函数value,promise胜利后的值,resolve的参数,类型:number、boolean、undefined、promisereason,promise失败后的值。reject的参数,示意回绝的起因exception,异样值标准Promise States有三种状态,pending、fulfilled、rejected pending 1.1 初始状态,可扭转 1.2 一个Promise在 resolve/reject 之前都处于这个状态 1.3 resolve: pending => fulfilled 状态 1.4 reject: pending => rejected 状态 fulfilled 2.1 最终状态,不可扭转 2.2 一个Promise在被resolve之后会变成这个状态 2.3 必须领有一个value值 rejected 3.1 最终状态,不可扭转 3.2 一个Promise在被reject之后会变成这个状态 3.3 必须领有一个reason值 pending -> resolve(value) -> fulfilled pending -> reject(reason) -> rejectedthenpromise 应该提供一个then办法,用来拜访最终的后果 promise.then(onFulfilled, onRejected)参数要求 1.1 onFulfilled 必须是一个函数类型,如果不是函数,应该被疏忽 (给一个默认函数) 1.2 onRejected 必须是一个函数类型,如果不是函数,应该被疏忽 (给一个默认函数) onFulfilled 个性 2.1 在 promise 变成 fulfilled 时,应该调用 onFulfilled,参数是 value 2.2 在 promise 变成 fulfilled 之前,不应该被调用 2.3 只能被调用一次 ...

January 27, 2022 · 2 min · jiezi

关于promise:爪哇学习笔记根据PromiseA规范来实现一个promise

1. 术语promise是一个有then办法的对象或函数,它的行为遵循本标准thenable是一个定义了then办法的对象或函数value是任意一个非法的JavaScript值,是promise状态为胜利时的值exception是一个应用throw关键字抛出的异样值reason是promise状态为失败时的值,示意promise失败的起因2. 标准2.1 Promise States一个promise必须处于三种状态之一:pending, fulfilled, rejected. pending 初始状态,可扭转(改变方式只有以下两种)可由pending变为fulfilled可由pending变为rejectedfulfilled 最终状态,不可变必须领有一个value,且不可变(===不可变)rejected 最终状态,不可变必须领有一个reason,且不可变(===不可变)2.2 then办法一个promise必须提供then办法来拜访其以后或最终value或reason 一个promise的then办法接管两个参数: promise.then(onFulfilled, onRejected)onFulfilled和onRejected都是可选参数 如果onFulfilled不是函数,则必须疏忽它如果onRejected不是函数,则必须疏忽它如果onFulfilled是函数 必须在promise变成fulfilled后调用onFulfilled, 并把value作为第一个参数在promise变成fulfilled之前, 不应该被调用只能被调用一次(所以在实现的时候须要一个变量来限度执行次数)如果onRejected是函数 必须在promise变成rejected后调用onRejected, 并把reason作为第一个参数在promise变成rejected之前, 不应该被调用只能被调用一次(所以在实现的时候须要一个变量来限度执行次数)在执行上下文堆栈仅蕴含平台代码之前,不得调用 onFulfilled 或 onRejected。(即应该应用工作的形式来执行这两个回调函数,本次实现应用微工作形式)onFulfilled 和 onRejected 必须作为函数调用then办法在同一个promise上能够屡次调用 当promise的状态变为fulfilled后,所有的 onFulfilled 回调都须要依照then的程序执行, 也就是依照注册程序执行(所以在实现的时候须要一个数组来寄存多个onFulfilled的回调)当promise状态变成 rejected 后,所有的 onRejected 回调都须要依照then的程序执行, 也就是依照注册程序执行(所以在实现的时候须要一个数组来寄存多个onRejected的回调)then办法必须返回一个promise 如果 onFulfilled 或 onRejected 返回值 x,则须要调用Promise Resolution Procedure: [[Resolve]](promise2, x)如果 onFulfilled 或者 onRejected 执行时抛出异样e,promise2必须被reject,且把reason作为参数如果 onFulfilled 不是一个函数, promise2 以promise1的value 触发fulfilled如果 onRejected 不是一个函数, promise2 以promise1的reason 触发rejected2.3 The Promise Resolution Procedure[[Resolve]](promise, x)如果 promise2 和 x 相等,那么 reject TypeError如果 x 是一个 promsie ...

January 17, 2022 · 4 min · jiezi

关于promise:Promise总结

Promise指标Promise A+标准手写Promise题目练习Promise A+标准术语promise: 一个领有合乎这个标准的行为的then办法的对象或函数。thenable: 定义了一个then办法的对象或函数。value: 任意非法的JavaScript值(包含undefined,thenable,promise)。exception: 应用throw语句抛出的一个值reason: 示意promise为什么被回绝的一个值必要条件Promise 状态promise必须是这三个状态中的一种:期待态pending,解决态fulfilled或回绝态rejected 当promise处于pending状态的时候: 可能变为fulfilled或者rejected状态。当promise处于fulfilled状态的时候: 2.1 肯定不能转换为任何其它状态 2.2 必须有一个不能扭转的value当promise处于rejected状态的时候: 3.1 肯定不能转换为任何其它状态 3.2 必须有一个不能扭转的reason在这里,"肯定不能扭转"意味着不变的身份(例如 ===),然而并不意味着深度不可变性。(译注者:这里应该是说只有值的援用雷同即可,并不需要援用中的每一个值都相等) then办法Promise必须提供一个then办法来拜访以后或最终的value或reason。 Promise的then办法承受俩个参数: promise.then(onFulfilled, onRejected)onFulfilled和onRejected都是可选的参数 1.1. 如果onFulfilled不是一个函数,它必须被疏忽 1.2. 如果onRejected不是一个函数,它必须被疏忽如果onFulfilled是一个函数 2.1. 在promise变成 fulfilled 时,应该调用 onFulfilled, 参数是value 2.2. 在promise变成 fulfilled 之前, 不应该被调用. 2.3. 它肯定不能被调用屡次。如果onRejected是一个函数 2.1. 在promise变成 rejected 时,应该调用 onRejected, 参数是reason 2.2. 在promise变成 rejected 之前, 不应该被调用. 2.3. 它肯定不能被调用屡次。在执行上下文栈中只蕴含平台代码之前,onFulfilled或onRejected肯定不能被调用同一个promise上的then可能被调用屡次 6.1. 如果promise被解决,所有相应的onFulfilled回调必须依照他们原始调用then的程序执行 6.2. 如果promise被回绝,所有相应的onRejected回调必须依照他们原始调用then的程序执行then必须返回一个promise对象promise2 = promise1.then(onFulfilled,onRejected)resolvePromiseresolvePromise(promise2, x, resolve, reject)如果promise和x援用同一个对象,用一个TypeError作为起因来回绝promise如果x是一个promise,依据x的状态: 2.1. 如果x是pending,promise必须放弃期待状态,直到x被解决或回绝 2.2. 如果x是fulfilled,用雷同的value解决promise 2.3. 如果x是rejected,用雷同的reason回绝promise否则,如果x是一个对象或函数 ...

December 26, 2021 · 5 min · jiezi

关于promise:asyncawait和Promise的区别

async/await和Promise都是异步办法,async/await能更好的解决then链async/await采纳同步的思维解决异步办法栗子:我的项目中遇到的一个问题,mounted时须要获取到全副的报警类型后,再获取已抉择的报警类型,最后做的是先调用getAllAlarmTypeList(),而后50ms的延时再调用getAlarmCheckedList()就不会报错,后通过asynce/await能够优化,且更容易了解。 应用Promise办法mounted() {this.getAllAlarmTypeList()setTimeout(this.handleAlarmTrendData, 50)},// 获取所有的报警类型 getAllAlarmTypeList() { let param = { subsystemType: 'XXXXX' } Api.getStatisticalAlarmTypes(param).then((res) => { if(res.value.length > 0) { // 代码 }) this.getAlarmCheckedList() } })},// 获取已抉择的报警类型 getAlarmCheckedList() { let param = { subsystemType: 'XXXXX' } Api.getCheckedAlarmTypeList(param).then(res => { if(res.value.length > 0) { // 代码 } })},应用async/await办法:// 获取所有的报警类型 getAllAlarmTypeList() { return new Promise(async (resolve, reject) => { let param = { subsystemType: 'XXXX' } try { let res = await Api.getStatisticalAlarmTypes(param) if(res.value.length > 0) { res.value = res.value.map((item) => { // 代码 }) resolve(res.value) } else { resolve([]) } } catch (error) { console.error('获取报警类型失败' + error) } })},// 获取已抉择的报警类型 ...

December 13, 2021 · 2 min · jiezi

关于promise:Promiseall-Promiserace-以及ES2020-新特性-PromiseallSettled

更多文章详见公众号【前端css和js干货】Promise是Es6最令人兴奋的个性,在那之前人们可能会通过第三方库如Bluebird或Q应用过promise,然而直到2015年才成为js的规范个性。Promise 对象代表一个异步操作的实现(或失败)以及他的后果值。Promise 会做一些可能须要一些工夫的事件,但最终它会在一切顺利时resolve,或者如果呈现问题则reject。 而后应用.then 和 .catch别离对result或error做一些事件。 const promise = new Promise(function(resolve, reject) { setTimeout(() => { if (Math.random(1) > 0.5) { resolve('Some value'); } else { reject('Some error'); } }, 500);});promise.then((response) => { console.log(response);}).catch(err => { console.log(err);});ES2020 带来了一个新个性:Promise.allSettled。补救了 ES6 Promise.all 和 Promise.race留下的缺点。 promises数组咱们常常不仅要解决一个 Promise,还要解决一系列的 Promise。 如果一次发送许多服务器申请,可能就是这种状况。 例如,我创立了一个蕴含五个 Promise 的数组。 在一段时间(100 毫秒、200 毫秒、……、500 毫秒)后,它们以 50% 的概率rsolve或rejected。 const arrayOfPromises = [];const arrayOfResponses = [];for (let i = 0 ; i < 5; i += 1) { arrayOfPromises.push(new Promise((resolve, reject) => { setTimeout(() => { if (Math.random(1) > 0.5) { resolve('Some value'); } else { reject('Some error'); } }, i * 100); }));}arrayOfPromises.forEach((promise) => { promise.then((response) => { arrayOfResponses.push(response); }).catch((err) => { arrayOfResponses.push(err); });});咱们能够手动解决这个 Promise 数组,在示例中将后果存储在arrayOfResponses数组中。 如果半秒后在控制台中显示数组,将看到如下内容: ...

November 30, 2021 · 1 min · jiezi

关于promise:await-与-Promiseall-结合使用

当遇到多个能够同时执行的异步工作时,就须要应用 Promise.all。 Promise.all 办法用于将多个 Promise 实例,包装成一个新的 Promise 实例。const p = Promise.all([p1, p2, p3])Promise.all 办法承受一个数组作为参数,p1、p2、p3 都是 Promise 实例,如果不是,就会先调用 Promise.resolve 办法,将参数转为 Promise 实例,再进一步解决。(Promise.all 办法的参数能够不是数组,但必须具备 Iterator 接口,且返回的每个成员都是 Promise 实例。) 而 async/await 自身就是 promise 的语法糖,因而能够与 Promise.all 联合应用: const p1 = async () => {}const p2 = async () => {}const p3 = async () => {}const [result1, result2, result3] = await Promise.all([p1, p2, p3])console.log(result1)console.log(result2)console.log(result3)

August 29, 2021 · 1 min · jiezi

关于promise:Promiseall和promiserace的应用场景举例

问题形容为了解决前端异步函数多层嵌套会产生回调天堂问题,以及回调天堂谬误不不便捕获的问题。所以,那些制作规定的大佬们,就在ES6中退出了一个新性能~Promise。本文次要记录一下Promise.all和promise.race的利用场景并举例说明。 对于Promise的基本概念什么的,这里就不赘述了。Promise.all办法简而言之:Promise.all( ).then( )实用于解决多个异步工作,且所有的异步工作都失去后果时的状况。比方:用户点击按钮,会弹出一个弹出对话框,对话框中有两局部数据出现,这两局部数据别离是不同的后端接口获取的数据。弹框弹出后的初始状况下,就让这个弹出框处于数据加载中的状态,当这两局部数据都从接口获取到的时候,才让这个数据加载中状态隐没。让用户看到这两局部的数据。那么此时,咱们就需要这两个异步接口申请工作都实现的时候做解决,所以此时,应用Promise.all办法,就能够轻松的实现,咱们来看一下代码写法 代码附上<template> <div class="box"> <el-button type="primary" plain @click="clickFn">点开弹出框</el-button> </div></template><script>export default { name: "App", methods: { clickFn() { this.alertMask = true; // 关上弹出框 this.loading = true; // 临时还没数据,所以就出现loading加载中成果 // 第一个异步工作 function asyncOne() { let async1 = new Promise(async (resolve, reject) => { setTimeout(() => { // 这里咱们用定时器模仿后端发申请的返回的后果,毕竟都是异步的 let apiData1 = "第一个接口返回数据啦"; resolve(apiData1); }, 800); }); return async1; } console.log("异步工作一", asyncOne()); // 返回的是一个Promise对象 // 第二个异步工作 function asyncTwo() { let async2 = new Promise(async (resolve, reject) => { setTimeout(() => { let apiData2 = "第二个接口返回数据啦"; resolve(apiData2); }, 700); }); return async2; } console.log("异步工作二", asyncTwo()); // 返回的是一个Promise对象 let paramsArr = [asyncOne(), asyncTwo()] // Promise.all办法接管的参数是一个数组,数组中的每一项是一个个的Promise对象 // 咱们在 .then办法外面能够取到 .all的后果。这个后果是一个数组,数组中的每一项 // 对应的就是 .all数组中的每一项的申请后果返回的值 Promise .all(paramsArr) .then((value) => { console.log("Promise.all办法的后果", value); this.loading = true; // 当初有数据了,所以就敞开loading加载中成果 }); }, },};</script>打印的后果图 ...

August 21, 2021 · 2 min · jiezi

关于promise:JS-原生方法原理探究十如何手写实现-PromiseA-及其方法

这是 JS 原生办法原理探索系列的第十篇文章。本文会介绍如何手写一个合乎 Promise A+ 标准的 Promise,并顺带实现 Promise 的相干办法。实现 Promise/A+术语为了更好地浏览本文,先约定一些术语和说法: promise 初始的时候状态还没有落定,处于 pending 状态;它能够落定为 resolved 状态(fulfilled 状态),用 value 示意它 resolve 的值;也能够落定为 rejected 状态,用 reason(拒因)示意它 reject 的值。then 办法承受的胜利回调函数称为 onFulfilled,失败回调函数称为 onRejected实现 Promise 构造函数咱们先尝试实现一个根底的 Promise 构造函数。 首先,用三个常量示意 promise 实例的状态: const PENDING = 'pending'const FULFILLED = 'fulfilled'const REJECTED = 'rejected'Promise 构造函数的作用是创立一个 promise 实例。对于一个 promise 实例来说,它会有几个根本的属性:status 记录 promise 的状态(初始为 pending),value 记录 promise resolve 的值(初始为 null),reason 记录 promise reject 的值(初始为 null)。 咱们别离在 Promise 构造函数中进行定义: ...

August 1, 2021 · 14 min · jiezi

关于promise:promise-和-Observable-的区别

StackOverflow 上的探讨:What is the difference between Promises and Observables? 得赞最高的一个答复:1777 赞 当异步操作实现或失败时,Promise 会解决单个事件。 留神:有 Promise 库反对 cancellation 操作,但 ES6 Promise 到目前为止还不反对。 Observable一个 Observable 就像一个 Stream(在许多语言中),容许传递零个或多个事件,其中为每个事件调用回调。 通常 Observable 比 Promise 更受欢迎,因为它提供了 Promise 的个性等等。应用 Observable,您是否要解决 0、1 或多个事件并不重要。您能够在每种状况下应用雷同的 API。 Observable 还比 Promise 具备可勾销的劣势。如果不再须要对服务器的 HTTP 申请或其余一些低廉的异步操作的后果,Observable 的订阅容许勾销订阅,而 Promise 最终会调用胜利或失败的回调,即便你不这样做不再须要告诉或它提供的后果。 尽管 Promise 会立刻启动,但 Observable 只有在您订阅它时才会启动。这就是为什么 Observable 被称为懈怠的起因。 Observable 提供了 map、forEach、reduce 等运算符,用法相似于数组。 还有一些弱小的操作符,如 retry() 或 replay() 等,它们通常十分不便。 提早执行容许在通过订阅执行 observable 之前建设一系列操作符,以进行更具申明性的编程。 排名第二的答复:374 赞 举例说明。 Angular 应用 Rx.js Observables 而不是 promises 来解决 HTTP。 ...

July 22, 2021 · 2 min · jiezi

关于promise:如何使用Promiseall

什么是 PromisePromise 是一个对象,它代表了一个异步操作的最终实现或者失败及其后果值。简略地说,Promise是一个示意当前某个时候会生成的值的占位符。Promise 是解决异步操作的十分有用的对象。JavaScript 提供了一个帮忙函数 Promise.all(promisesArrayOrIterable) 反对并行处理多个Promises,并且在一个聚合数组中获取后果值。我么一起来学习下Promise.all()是怎么工作的。 1.Promise.all()Promise.all() 是内置的帮忙函数可能承受promise数组,函数返回的格局如下: const allPromise = Promise.all([promise1, promise2, ...]); 而后能够应用 then-able 语法提取Promise返回的值: `allPromise.then(values => { values; // [valueOfPromise1, valueOfPromise2, ...]}).catch(error => { error; // rejectReason of any first rejected promise});` 或者应用async/await 语法:`try { const values = await allPromise; values; // [valueOfPromise1, valueOfPromise2, ...]} catch (error) { error; // rejectReason of any first rejected promise}` 最有用的是Promise 能够通过 Promise.all() 获取resolved 或rejected 如果所有的promise对象申请胜利了,那么 allPromise 是由Promise 组成的数组。Promises的返回程序与入数组栈的程序无关。 ...

July 13, 2021 · 1 min · jiezi

关于promise:Promiseprototypedone

promise设计规格并没有对 Promise.prototype.done做出任何规定,因而在应用的时候,你能够应用已有类库提供的实现,也能够本人去实现。 作用无论Promise对象的回调链以then办法还是catch结尾,只有最初一个办法抛出谬误,就有可能无奈捕捉到(因为Promise外部的谬误不会冒泡到全局),因而,须要提供一个done办法,它总是处于回调链的尾端(被执行),保障抛出任何可能呈现的谬误; 示例代码"use strict";if (typeof Promise.prototype.done === "undefined") { Promise.prototype.done = function (onFulfilled, onRejected) { this.then(onFulfilled, onRejected).catch(function (error) { setTimeout(function () { throw error; }, 0); }); };}done 有以下两个特点1、done 中呈现的谬误会被作为异样抛出2、终结 Promise chain

May 25, 2021 · 1 min · jiezi

关于promise:使用Promiserace实现超时机制取消XHR请求

咱们来看一下如何应用Promise.race来实现超时机制。当然XHR有一个 timeout 属性,应用该属性也能够简略实现超时性能,然而为了能反对多个XHR同时超时或者其余性能,咱们采纳了容易了解的异步形式在XHR中通过超时来实现勾销正在进行中的操作。 让Promise期待指定工夫首先咱们来看一下如何在Promise中实现超时。所谓超时就是要在通过肯定工夫后进行某些操作,应用 setTimeout 的话很好了解。首先咱们来串讲一个单纯的在Promise中调用 setTimeout 的函数。 //delayPromise.jsfunction delayPromise(ms) { return new Promise(function (resolve) { setTimeout(resolve, ms); });}Promise.race中的超时Promise.race就是一组promise中只有有一个返回,其它的promise就不会执行后续回调(无论谬误还是胜利) var winnerPromise = new Promise(function (resolve) { setTimeout(function () { console.log('this is winner'); resolve('this is winner'); }, 4); });var loserPromise = new Promise(function (resolve) { setTimeout(function () { console.log('this is loser'); resolve('this is loser'); }, 1000); });// 第一个promise变为resolve后程序进行,第二个promise不会进入回调Promise.race([winnerPromise, loserPromise]).then(function (value) { console.log(value); // => 'this is winner'});咱们能够将方才的 delayPromise 和其它promise对象一起放到 Promise.race 中来是实现简略的超时机制。 ...

May 24, 2021 · 3 min · jiezi

关于promise:promise内部实现

从本文你将理解到什么是promisepromise的外部实现 resolve实例属性reject实例属性then办法then办法的屡次调用then的链式调用谬误捕捉try{}catch(e){}then可选参数静态方法 all 的实现静态方法 resolve 的实现实例办法 finally 的实现实例办法 catch 的实现 什么是promise步骤剖析 /** * 1.Promise是个类,参数是个回调函数(执行器),这个执行器会立刻执行 * 2.promise中有三种状态,胜利fulfilled,失败rejected,期待pending,一旦状态确定,则不可更改 * pending -> fulfilled * pending -> rejected * 3.resolve,reject函数是用来扭转状态的 * resolve() pending -> fulfilled * reject() pending -> rejected * 4.then办法外部做的事件就是判断状态 如果状态是胜利调用胜利的回调函数,如果是失败调用失败的回调函数, * then办法是被定义在原型对象中的 * 5.then胜利的回调函数有个参数,示意胜利之后的值。then失败的回调函数有个参数,示意失败之后的起因*/new Promise((resolve,reject)=>{resolve("胜利")// reject("失败")})实现实现最根底的性能申明一个 MyPromise 类,在构造函数中接管一个执行器,并立刻执行这个执行器 // 定义状态常量const PENDING = 'pending'; // 期待const FULFILLED = 'fulfilled'; // 胜利const REJECTED = 'rejected'; // 失败class MyPromise { constructor(executor) { // 执行器接管两个参数,resolve 和 reject // 执行器立刻执行 executor(this.resolve, this.reject); } // 定义实例的状态属性: 初始值为 pending,状态一旦确定,就不可更改 status = PENDING;}执行 执行器 的时候,须要传递两个参数,resolve 和 reject。 ...

May 18, 2021 · 8 min · jiezi

关于promise:前端笔记Promise

Promise executorPromise 对象的结构器(constructor)语法如下: let promise = new Promise(function(resolve, reject) { // executor(生产者代码)});传递给 new Promise 的函数被称为 executor。当 new Promise 被创立,executor 会主动运行,它蕴含最终应产出后果的生产者代码。由 new Promise 结构器返回的 promise 对象具备以下外部属性: state — 最后是 "pending",而后在 resolve 被调用时变为 "fulfilled",或者在 reject 被调用时变为 "rejected"。 result — 最后是 undefined,而后在 resolve(value) 被调用时变为 value,或者在 reject(error)被调用时变为 error。留神: executor 只能调用一个 resolve 或一个 reject。任何状态的更改都是最终的。后续的 resolve 和 reject 的调用都会被疏忽。 resolve/reject 只须要一个参数(或不蕴含任何参数),并且将疏忽额定的参数 Resolve/reject 能够立刻进行:executor 通常是异步执行某些操作,并在一段时间后调用 resolve/reject,但这不是必须的。能够立刻调用 resolve 或 reject。 Promise 对象的 state 和 result 属性都是外部的,无奈间接拜访它们。但能够对它们应用 .then/.catch/.finally 办法。 ...

April 9, 2021 · 2 min · jiezi

关于promise:Promise-A-规范

听名字莫名其妙,齐全没听说过,然而面试官就非要问。Promise标准很多,有A/B/D/A+,然而ES6用的是A+ 标准解读一个promise的以后状态只能是pending、fullfilled和rejected三种,状态扭转之恩那个是pending->fullfilled或pending->rejected,状态扭转不可逆Promise的then办法承受两个参数,示意promise状态产生扭转时的回调(onFullfilled,onRejected),then办法返回一个promise,then能够被一个promise屡次调用标准解读结束... Promise原理雏形 function Promise(fn) { let value = null, callbacks = [] // 观察者模式,注册事件 this.then = function(onFullfilled) { callbacks.push(onFullfilled) } function resolve(value) { callbacks.forEach(function(callback){ callback(value) }) } fn(reslove)}

April 8, 2021 · 1 min · jiezi

关于promise:Promiseresolve与new-Promiser-rv

Promise.resolve办法的参数分成四种状况。参数是一个 Promise 实例如果参数是 Promise 实例,那么Promise.resolve将不做任何批改、一成不变地返回这个实例。这是一个非凡的状况会和另一种new Promise(r => r(v))产生不一样的成果,最初阐明 参数是一个thenable对象thenable对象指的是具备then办法的对象,比方上面这个对象 let thenable = { then: function(resolve, reject) { resolve(42); }};Promise.resolve办法会将这个对象转为 Promise 对象,而后就立刻执行thenable对象的then办法。 let thenable = { then: function(resolve, reject) { resolve(42); }};let p1 = Promise.resolve(thenable);p1.then(function(value) { console.log(value); // 42});thenable对象的then办法执行后,对象p1的状态就变为resolved,从而立刻执行最初那个then办法指定的回调函数,输入 42 参数不是具备then办法的对象,或基本就不是对象如果参数是一个原始值,或者是一个不具备then办法的对象,则Promise.resolve办法返回一个新的 Promise 对象,状态为resolved。 const p = Promise.resolve('Hello');p.then(function (s){ console.log(s)});// Hello因为字符串Hello不属于异步操作(判断办法是字符串对象不具备 then 办法),返回 Promise 实例的状态从毕生成就是resolved,所以回调函数会执行。Promise.resolve办法的参数,会同时传给回调函数 不带有任何参数Promise.resolve办法容许调用时不带参数,间接返回一个resolved状态的 Promise 对象。 setTimeout(function () { console.log('three');}, 0);Promise.resolve().then(function () { console.log('two');});console.log('one');// one// two// three.then()函数里不返回值或者返回的不是promise,那么 then 返回的 Promise 将会成为承受状态(resolve) ...

March 18, 2021 · 1 min · jiezi

关于promise:又开始了rxjs-与promise的比较

1.promise 的 resolve 与 reject,任何时候都是异步的,会将回调放在下一个微工作的循环中调用 let nn = Promise.resolve('niahoP1');nn.then(console.log)console.log('niahoP2')// niahoP2 niahoP12.rxjs 的 subscribe 是同步的,流更新之后立即就会同步调用订阅者 let su = new rxjs.Subject()console.log('nihao1')su.subscribe(console.log);su.next('nihao3')console.log('nihao2')// nihao1 nihao3 nihao2// 很遗憾,然而事实就是这样的3.流解决中产生了任何的未捕捉的谬误,都会导致这个流挂掉,前面再更新流无奈触发订阅 let {map, switchMap} = rxjs.operators;let { Subject } = rxjs;let ss = new Subject();ss.pipe( map(value => { console.log(value, Object.keys(value), 'keys') // console.log(value.b.c) // 失常状况 > ss 2 // 放开这一行会有一个执行谬误,这时后果为 TypeError: Cannot read property 'c' of undefined return value })).subscribe({ complete: console.log, error: console.log, next: console.log})ss.next('ss')setTimeout(() => {ss.next(2)}, 2000)4.完犊子,这里代码我看不懂了,如果subject的订阅是同步的,那为什么宏工作中报错的代码,下一行代码还会继续执行呢?我傻了,,,http://jsrun.net/pzaKp/edit ...

February 5, 2021 · 1 min · jiezi

关于promise:每日一题面试官问你对Promise的理解可能是需要你能手动实现各个特性

关注公众号「松宝写代码」,精选好文,每日一题 退出咱们一起学习,day day up 作者:saucxs | songEagle起源:原创 一、前言2020.12.23日刚立的flag,每日一题,题目类型不限度,能够是:算法题,面试题,论述题等等。 往期「每日一题」: 第2道[「[每日一题]ES6中为什么要应用Symbol?」](https://mp.weixin.qq.com/s/om...第1道「一道面试题是如何引发深层次的灵魂拷问?」接下来是第3道:谈谈你对 promise 的了解? 二、谈谈你对 promise 的了解?1、咱们简略概括一下promisePromise 是 ES6 新增的语法,解决了回调天堂的问题。 无论是ES6的Promise也好,jQuery的Promise也好,不同的库有不同的实现,然而大家遵循的都是同一套标准,所以,Promise并不指特定的某个实现,它是一种标准,是一套解决JavaScript异步的机制。 Promise 实质上就是一个绑定了回调的对象,而不是将回调传回函数外部。 所以,Promise在肯定水平上解决了回调函数的书写构造问题,但回调函数仍然在主流程上存在,只不过都放到了then(...)外面,和咱们大脑程序线性的思维逻辑还是有出入的。 2、咱们说一下promise相干标准能够把 Promise 看成一个状态机。初始是 pending 状态,能够通过函数 resolve 和 reject ,将状态转变为 resolved 或者 rejected 状态,状态一旦扭转就不能再次变动。then 函数会返回一个 Promise 实例,并且该返回值是一个新的实例而不是之前的实例。因为 Promise 标准规定除了 pending 状态,其余状态是不能够扭转的,如果返回的是一个雷同实例的话,多个 then 调用就失去意义了。then 办法能够被同一个 promise 调用屡次。值穿透三、promise 是如何实现的?1、Promise的简略应用 咱们通过这种应用构建Promise实现的最后版本 2、Promise的大抵框架大抵框架有了,然而Promise状态,resolve函数,reject函数,以及then等回调没有具体解决 3、Promise的链式存储咱们先看一个例子: 每距离1秒打印一个数字,哈哈,这个不是实在的距离1秒,汪汪, 这个的输入是啥? 打印程序:1、2、3 这里咱们能确认的是: 让a,b,c的只能在then的回调接管到在间断的异步调用中,如何保障异步函数的执行程序Promise一个常见的需要就是间断执行两个或者多个异步操作,这种状况下,每一个起初的操作都在后面的操作执行胜利之后,带着上一步操作所返回的后果开始执行。这里用setTimeout来解决. 4、Promise的状态机制和执行程序为了保障Promise的异步操作时的程序执行,这里给Promise加上状态机制 5、Promise的递归执行每个Promise前面链接一个对象,该对象蕴含onresolved,onrejected,子promise三个属性. 当父Promise 状态扭转结束,执行完相应的onresolved/onrejected的时候,拿到子promise,在期待这个子promise状态扭转,在执行相应的onresolved/onrejected。顺次循环直到以后promise没有子promise。 ...

December 26, 2020 · 1 min · jiezi

关于promise:一次写过瘾手写Promise全家桶Generatorasyncawait

观感度:???????????????????? 口味:海底捞 烹饪工夫:15min 本文已收录在前端食堂同名仓库Github github.com/Geekhyt,欢迎光临食堂,如果感觉酒菜还算可口,赏个 Star 对食堂老板来说是莫大的激励。手写 Promise 全家桶Promise/A+ 标准镇楼! 如果你没读过 Promise/A+ 标准也没关系,我帮你总结了如下三局部重点: 不过倡议看完本文后还是要亲自去读一读,不多 bb,开始展现。 标准重点1.Promise 状态Promise 的三个状态别离是 pending、fulfilled 和 rejected。 pending: 待定,Promise 的初始状态。在此状态下能够落定 (settled) 为 fulfilled 或 rejected 状态。fulfilled: 兑现(解决),示意执行胜利。Promise 被 resolve 后的状态,状态不可再扭转,且有一个公有的值 value。rejected: 回绝,示意执行失败。Promise 被 reject 后的状态,状态不可再扭转,且有一个公有的起因 reason。留神:value 和 reason 也是不可变的,它们蕴含原始值或对象的不可批改的援用,默认值为 undefined。 2.Then 办法要求必须提供一个 then 办法来拜访以后或最终的 value 或 reason。 promise.then(onFulfilled, onRejected)1.then 办法承受两个函数作为参数,且参数可选。2.如果可选参数不为函数时会被疏忽。3.两个函数都是异步执行,会放入事件队列期待下一轮 tick。4.当调用 onFulfilled 函数时,会将以后 Promise 的 value 值作为参数传入。5.当调用 onRejected 函数时,会将以后 Promise 的 reason 失败起因作为参数传入。6.then 函数的返回值为 Promise。7.then 能够被同一个 Promise 屡次调用。3.Promise 解决过程Promise 的解决过程是一个形象操作,接管一个 Promise 和一个值 x。 ...

December 19, 2020 · 8 min · jiezi

关于promise:前端面试每日-31-第598天

明天的知识点 (2020.12.04) —— 第598天 (我也要出题)[html] 你有应用过del标签吗?说说它的用处[css] css变量辨别大小写吗?[js] promise有哪几种状态?是如何变动的?[软技能] 除了工作外,你为团队还做过哪些奉献?《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!!欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨!心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

December 4, 2020 · 1 min · jiezi

关于promise:前端面试每日-31-第596天

明天的知识点 (2020.12.02) —— 第596天 (我也要出题)[html] 你有应用过ins标签吗?说说它的用处[css] css变量和预处理器中的变量有什么不同?[js] 应用js实现一个并发限度的promise,并保障最多同时运行三个工作[软技能] 你有本人或者为公司写过专利吗?《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!!欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨!心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

December 2, 2020 · 1 min · jiezi

关于promise:Promise使用

Promise应用1.开发环境 uni-app2.电脑系统 windows10专业版3.在开发的过程中,咱们都是会应用到Promise,如果说你当初还不晓得什么是Promise,为什么应用Promise,那么你真的落后啦!上面我来分享一下Promise应用办法,心愿对你有所帮忙!4.uni-app数据申请,uni-app提供的uni.request({})进行简略的Promise封装,在methods中增加代码如下: chengeth5(){ return new Promise((resolve,reject)=>{ uni.request({ url:'/api/feng', method:'post', data:this.ChenindexconOnj, success:(res)=>{ // console.log(res);//输入申请到的数据 resolve(res);//resolve作用是,将Promise对象的状态从“未实现”变为“胜利”(即从 pending 变为 resolved),在异步操作胜利时调用,并将异步操作的后果,作为参数传递进来。这个是一个重点,切记不要遗记写! }, }) }) },5.在methods中再定义一个办法,代码如下: async CChen(){ let ok=await this.chengeth5(); console.log(ok); },6.在浏览器中输入后果,成果如下:7.本期的分享到了这里就完结啦,是不是很nice,让咱们一起致力走向巅峰!

November 18, 2020 · 1 min · jiezi

关于promise:Promise三种状态

三种状态1.pending:在过程中还没有后果2.resolved:胜利3.rejected:失败 状态变动1、pending -> resolved2、pending -> rejected 状态的体现pending状态不会触发then和catchresolved状态会触发后续的then回调函数rejected状态会触发后续的catch回调函数 then和catch扭转状态then失常状况下会返回resolved,报错则返回rejectedcatch失常状况下会返回resolved,报错则返回rejected 测试题//第一题(后果会打印进去1,3,返回resolved状态)Promise.resolve().then(()=>{ console.log(1) //1 resolved}).catch(()=>{ console.log(2)}).then(()=>{ console.log(3) // 3 resolved})//第二题(后果会打印进去1,2,3)Promise.resolve().then(()=>{ console.log(1) //1 throw new Error("error1") //rejected}).catch(()=>{ console.log(2) //2 resolved}).then(()=>{ console.log(3) //3 resolved})//第三题(后果会打印进去1,2)Promise.resolve.then(()=>{ console.log(1) //1 throw new Error("error1") //rejected}).catch(()=>{ console.log(2) //2 resolved}).catch(()=>{ console.log(3)})

September 5, 2020 · 1 min · jiezi

关于promise:前端面试每日-31-第490天

明天的知识点 (2020.08.18) —— 第490天 (我也要出题)[html] 你最喜爱html的哪个标签?为什么?[css] 应用css3制作下雨动画的成果[js] 如何勾销promise?[软技能] 请说说扫码登录的原理及流程《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!!欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨!心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

August 18, 2020 · 1 min · jiezi

关于promise:PromisesA规范

Promises/A+标准一个凋谢的规范,实现者为开发者提供的可操作JavaScript promise。promise代表着异步操作最终后果。和promise交互的次要形式是通过其then办法,then办法通过注册回调以承受promise的最终值或者promise无奈实现的起因。该标准详细描述了then办法的行为,提供了一个可互操作的根底,所有Promises/A+统一的promise实现都能够依赖于它来提供。因而,标准应该被认为是十分稳固的。只管Promises/A+组织偶然会对本标准进行一些小的向后兼容更改,以解决新发现的小问题,但只有通过认真思考、探讨和测试后,咱们才会集成较大或向后不兼容的更改。从历史上看,Promises/A+说明了晚期Promise/A提案的行为条款,将其扩大到涵盖事实上的行为,并省略了未指定或有问题的局部。最初,外围Promises/A+标准不波及如何创立、实现或回绝promise,而是抉择集中于提供可互操作的then办法。将来在配套标准中的工作可能会波及到这些主题。 1.术语“promise”是then行为合乎本标准的对象或函数。“ thenable”是定义then办法的对象或函数。“值”是任何非法的JavaScript值(包含undefined,ableable或promise)。“ exception”是应用该throw语句引发的值。“起因”是一个值,该值批示为什么回绝promise。2.要求2.1 promise状态promise必须处于以下三种状态之一:待定,已实现或被回绝。 待定时,promise:可能会转换为已实现或已回绝状态。当实现时,promise: 不得过渡到其余任何状态。必须具备一个值,该值不能更改。当被回绝时,promise: 不得过渡到其余任何状态。必须有一个理由,不能扭转。在此,“不得更改”是指不变的身份(即===),但并不示意深层的不变性。2.2 then办法promise必须提供一种then拜访其以后或最终价值或起因的办法。允诺的then办法承受两个参数: promise.then(onFulfilled, onRejected)这两个onFulfilled和onRejected可选的参数: 如果onFulfilled不是函数,则必须将其疏忽。如果onRejected不是函数,则必须将其疏忽。如果onFulfilled是一个函数: 必须在promise实现后调用,以promise的值作为第一个参数。在promise实现之前肯定不能调用它。不能屡次调用它。如果onRejected是一个性能, 必须在promise被回绝之后以promise的理由作为第一个参数调用它。在promise被回绝之前不能调用它。不能屡次调用它。onFulfilled或onRejected在执行上下文堆栈仅蕴含平台代码之前不得调用。[ 3.1 ]。onFulfilled并且onRejected必须作为函数调用(即没有this值)。[ 3.2 ]then 可能在同一诺言中屡次被调用。 如果/何时promise实现,则所有各自的onFulfilled回调必须依照其对的原始调用的程序执行then。如果/何时promise被回绝,则所有各自的onRejected回调必须依照其对的原始调用的程序执行then。then必须返回一个promise[ 3.3 ]。 如果有一个onFulfilled或onRejected返回一个值x,请运行Promise Resolution Procedure [[Resolve]](promise2, x)。如果任何一个onFulfilled或onRejected引发异样e,则promise2必须e以其为理由予以回绝。如果onFulfilled不是函数且promise1已实现,则promise2必须应用与雷同的值来实现promise1。如果onRejected不是性能而promise1被回绝,则promise2必须以与雷同的理由将其回绝promise1。 promise2 = promise1.then(onFulfilled, onRejected);2.3promise解决程序promise解决过程是一个形象的操作作为输出一个promise和一个值,它示意咱们作为[[Resolve]](promise, x)。如果x是可能的,则在行为至多相似于诺言的假如下,尝试promise采纳的状态。否则,它将满足value 。xxpromisex只有对约定的实现公开Promises / A +兼容的then办法,对约定的实现就能够实现互操作。它还容许Promises / A +实现以正当的then办法“异化”不合格的实现。要运行[[Resolve]](promise, x),请执行以下步骤: 如果promise和x援用雷同的对象,promise则以回绝TypeError为理由。如果x是一个promise,则采纳其状态[ 3.4 ]: 如果x未决,则promise必须放弃未决状态,直到x实现或被回绝。如果/何时x满足,promise则以雷同的值满足。如果/何时x被回绝,promise则以雷同的理由回绝。否则,如果x是对象或函数, then是x.then。[ 3.5 ]如果检索属性x.then中抛出的异样的后果e,回绝promise与e作为的起因。如果then是函数,请应用xas this,第一个参数resolvePromise和第二个参数进行调用rejectPromise,其中: 如果/何时resolvePromise应用值调用y,请运行[[Resolve]](promise, y)。如果/当rejectPromise是带一个理由r,回绝promise与r。如果同时调用resolvePromise和rejectPromise,或者对同一参数进行了屡次调用,则第一个调用优先,而所有其余调用均被疏忽。如果调用then引发异样e, 如果resolvePromise或rejectPromise曾经被调用,则疏忽它。否则,回绝promise与e作为的起因。如果then不是一个函数,实现promise用x。如果x不是一个对象或性能,实现promise与x。如果应用参加循环的可循环链的可扩大物解决了诺言,使得[[Resolve]](promise, thenable)最终的递归性质最终导致[[Resolve]](promise, thenable)再次被调用,则遵循上述算法将导致有限递归。激励但不是必须的实现,以检测这种递归并promise以提供信息TypeError的理由回绝。[ 3.6 ] 3.笔记这里的“平台代码”是指引擎,环境和promise实现代码。实际上,此要求可确保在调用事件循环之后并应用新堆栈onFulfilled并onRejected异步执行then。这能够通过“宏工作”机制(例如setTimeout或setImmediate)或“微工作”机制(例如MutationObserver或)来实现process.nextTick。因为promise实现被视为平台代码,因而它自身可能蕴含一个任务调度队列或“蹦床”,在其中调用处理程序。也就是说,在严格模式下this将呈现undefined在其中;在懒惰(sloppy)模式下,它将是全局对象。promise2 === promise1如果实现满足有要求,则实现能够容许。每个实现都应记录其是否能够生产promise2=== promise1以及在什么条件下生产。通常,只有x它来自以后的实现,才晓得这是一个真正的promise。本节容许应用特定于实现的形式来采纳已知合乎promise的状态。首先存储对的援用x.then,而后测试该援用,而后调用该援用的过程防止了对该x.then属性的屡次拜访。此类预防措施对于确保访问者属性的一致性十分重要,因为访问者属性的值在两次检索之间可能会发生变化。实现应不设置thenable链的深度任何限度,并假如超出任何限度递归将是有限的。只有真正的周期能力导致TypeError; 如果遇到有限多个不同的罐头,则永远递归是正确的行为。原文地址

August 10, 2020 · 1 min · jiezi

关于promise:研究当resolve函数参数里是另外一个Promise实例

起因明天遇到一个题目,钻研了一天,从新复习了一遍Promise实现,得进去一个不算论断的论断...... 这个题通过我的化简长成这样,求代码后果 const p = Promise.resolve()new Promise(resolve => { new Promise(resolve => {resolve(p)}) .then(() => { console.log('after:await') })})let p1 = p.then(() => { console.log('tick:a')})let p2 = p1.then(() => { console.log('tick:b')})let p3 = p2.then(() => { console.log('tick:c')})/*p.then(() => { console.log('tick:a')}).then(() => { console.log('tick:b')}).then(() => { console.log('tick:c')})*/promise本质咱们晓得excutor同步执行,then外面的代码异步执行,怎么实现的?简略的说(这里以胜利为例),then外面的代码同步增加到所属promise的胜利回调队列,当excutor外面的参数resolve办法执行的时候,会把胜利回调队列外面的代码顺次执行 对resolve参数的解决如果excutor的resolve办法承受的参数是一个Promise对象会怎么样?首先我在promiseA+标准外面并没有找到这种状况的规定 而后我看了三个promise库,bluebird,es6-promise,promise,都没有对这种状况作解决,也就是当成一个一般的对象 最初阮一峰的es6外面对这种状况有形容 resolve函数的参数除了失常的值以外,还可能是另一个 Promise 实例,这时p1的状态就会传递给p2,p2的回调函数就会期待p1的状态扭转应该是新增加的Promise的规定 已有的材料的相干实现在网上看了很多Promise实现,根本对promise的excutor的resolve办法的实现是这样的promise实现。对参数如果是Promise都是等promise执行完再调resolve constructor(executor){ ... let resolve = (value) =>{ // 如果resolve的值时一个promise if(value instanceof Promise){ // 我就让这个promise执行,把胜利的后果再次判断 return value.then(resolve,reject) //参数会主动传递到resolve外面去 } if (this.status === 'pending') { this.status = 'fulfilled' this.value = value this.onFulfilledCallback.forEach(fn => fn(this.value)) } } ...留神,这种实现能跑过PromiseA+标准测试用例!从A+标准的角度没有问题 ...

July 28, 2020 · 1 min · jiezi

关于promise:手写Promise-实例方法catchfinally

手写Promise - 实现一个根底的Promise手写Promise - 实例办法catch、finally手写Promise - 罕用静态方法all、any、resolve、reject、race 上一篇文章手写了一个根底的Promise,咱们持续来欠缺它,为其增加常常用到的catch和finally办法 catch & finallycatch() 办法返回一个Promise,并且解决回绝的状况。咱们晓得then办法的第二个参数其实就是干这个用的,catch只是一个别名。 finally() 办法返回一个Promise。在promise完结时,无论后果是fulfilled或者是rejected,都会执行指定的回调函数。和catch一样,也只是对then的一个简写,相当于是传入的函数既是onFulfilled也是onRejected。 有一点须要留神,finally和catch办法只是then的一个别名,实际上返回的还是一个promise,齐全能够这样写:promise.then().finally().then().catch().then() 咱们把上一章节的代码拷过去,而后向外面增加catch和finally办法。 class WPromise { static pending = 'pending'; static fulfilled = 'fulfilled'; static rejected = 'rejected'; constructor(executor) { this.status = WPromise.pending; // 初始化状态为pending this.value = undefined; // 存储 this._resolve 即操作胜利 返回的值 this.reason = undefined; // 存储 this._reject 即操作失败 返回的值 // 存储then中传入的参数 // 至于为什么是数组呢?因为同一个Promise的then办法能够调用屡次 this.callbacks = []; executor(this._resolve.bind(this), this._reject.bind(this)); } // onFulfilled 是胜利时执行的函数 // onRejected 是失败时执行的函数 then(onFulfilled, onRejected) { // 返回一个新的Promise return new WPromise((nextResolve, nextReject) => { // 这里之所以把下一个Promsie的resolve函数和reject函数也存在callback中 // 是为了将onFulfilled的执行后果通过nextResolve传入到下一个Promise作为它的value值 this._handler({ nextResolve, nextReject, onFulfilled, onRejected }); }); } // catch办法只有一个参数用于处理错误的状况 catch(onRejected) { return this.then(null, onRejected); } finally(onFinally) { return this.then(onFinally, onFinally); } _resolve(value) { // 解决onFulfilled执行后果是一个Promise时的状况 // 这里可能了解起来有点艰难 // 当value instanof WPromise时,阐明以后Promise必定不会是第一个Promise // 而是后续then办法返回的Promise(第二个Promise) // 咱们要获取的是value中的value值(有点绕,value是个promise时,那么外部存有个value的变量) // 怎么将value的value值获取到呢,能够将传递一个函数作为value.then的onFulfilled参数 // 那么在value的外部则会执行这个函数,咱们只须要将以后Promise的value值赋值为value的value即可 if (value instanceof WPromise) { value.then( this._resolve.bind(this), this._reject.bind(this) ); return; } this.value = value; this.status = WPromise.fulfilled; // 将状态设置为胜利 // 告诉事件执行 this.callbacks.forEach(cb => this._handler(cb)); } _reject(reason) { if (reason instanceof WPromise) { reason.then( this._resolve.bind(this), this._reject.bind(this) ); return; } this.reason = reason; this.status = WPromise.rejected; // 将状态设置为失败 this.callbacks.forEach(cb => this._handler(cb)); } _handler(callback) { const { onFulfilled, onRejected, nextResolve, nextReject } = callback; if (this.status === WPromise.pending) { this.callbacks.push(callback); return; } if (this.status === WPromise.fulfilled) { // 传入存储的值 // 未传入onFulfilled时,将undefined传入 const nextValue = onFulfilled ? onFulfilled(this.value) : undefined; nextResolve(nextValue); return; } if (this.status === WPromise.rejected) { // 传入存储的错误信息 // 同样的解决 const nextReason = onRejected ? onRejected(this.reason) : undefined; nextReject(nextReason); } }}是的,就是这么简略,当初来测试一下: ...

July 17, 2020 · 2 min · jiezi

手写Promise-实现一个基础的Promise

前端开发中常常会用到Promise,不过有局部人并不分明Promise的原理,本文也是自己在学习Promise时对Promis的一些意识,心愿能对各位童鞋有所帮忙。 手写Promise - 实现一个根底的Promise[手写Promise - 实例办法catch、finally]()[手写Promise - 罕用静态方法all、any、resolve、reject、race]() 从意识Promise开始。。。/* 模仿一个简略的异步行为 */function fetchData() { return new Promise((resolve, reject) => { setTimeout(() => { resolve('willem'); }, 1000); });}fetchData().then((data) => { // after 1000ms console.log(data); // willem return 'wei';}, (err) => {}).then((data2) => { console.log(data2); // wei});下面的例子算是一个最常见的用法,可能在应用的时候更多的应用的是catch来解决异样来代替then办法的第二个参数,但catch也只是一个then的语法糖。 从中咱们能够用一些句子来形容Promise。 promise是一个类,它的构造函数承受一个函数,函数的两个参数也都是函数在传入的函数中执行resolve示意胜利,执行reject示意失败,传入的值会传给then办法的回调函数promise有一个叫做then的办法,该办法有两个参数,第一个参数是胜利之后执行的回调函数,第二个参数是失败之后执行的回调函数。then办法在resolve或者reject执行之后才会执行,并且then办法中的值是传给resolve或reject的参数promise反对链式调用有了相应的形容,接下来就是来一步一步实现了。 简略版Promise1. promise是一个类,它的构造函数承受一个函数,函数的两个参数也都是函数 第一点比较简单 // 这里没有应用Promise作为类名是为了不便测试class WPromise { constructor(executor) { // 这里绑定this是为了避免执行时this的指向扭转,this的指向问题,这里不过多赘述 executor(this._resolve.bind(this), this._reject.bind(this)); } _resolve() {} _reject() {}}2. 在传入的函数中执行resolve示意胜利,执行reject示意失败,传入的值会传给then办法的回调函数 胜利、失败,这个很容易想到应用一个状态进行标记,实际上Promise就是这样做的。在Promise中应用了pending、fulfilled、rejected来标识以后的状态。 ...

July 11, 2020 · 4 min · jiezi

Promise周边方法

上面了解promise a+之后,那么这篇文章就是扩展一下promise的周边方法promisify的实现promisify是node提供的一个方法用来解决回调嵌套问题,用起来很方便;我项目中有两个文件,一个为name.txt,里面存放的是age.txt,另一个为age.txt里面的内容为18,这里就是为了演示多个异步接收返回值问题,现在让我们看看原来获取异步返回值,毫无疑问这样非常的恶心 原始调用异步let fs= require('fs');fs.readFile('./name.txt', 'utf8', function (err, data) { console.log(data);//age.txt if (err) { console.log(err); } else { fs.readFile(data, 'utf8', function (err, data) { if (err) { console.log(err); } else { console.log(data); } }) }});既然已经看到他的恶心之处了,那我们想办法优化一下,封装一个公共函数: read公共方法的封装function read(...args) { let dfd = Promise.defer();//这个是我们上一账封装的promise中的方法 fs.readFile(...args, function (err, data) { if (err) dfd.reject(err); dfd.resolve(data) }); return dfd.promise}使用的时候如下: read('./name.txt', 'utf8').then(data => { console.log(data); return read(data, 'utf8')}).then(data => { console.log(data);})上面这种看起来不错,但是还是不能让人满意,因为他的功能太单一了,这时候我们的主角promisify就上场了,那么我们先来看一看它原本是怎么用的: promisify使用let {promisify} = require('util');//node提供的方法库let readFile = promisify(fs.readFile); //用什么方法就把对应的方法传进去,肥肠的方便readFile('./name.txt', 'utf8').then(data => { console.log(data);//age.txt return readFile(data, 'utf8')}).then(data => { console.log(data);//18})promisify实现上面的用法很简单,那么我们简单的实现一下吧,用法和以上相同 ...

June 23, 2020 · 2 min · jiezi