reject相关知识
-
[MDN]笔记:Promise本文就是从MDN中copy的,仅为了自己复习方便。 1、 executor new Promise( function(resolve, reject) {...} /* executor */ ); executor是带有 resolve和reject两个参数的函数 。Promise构造函数执行时立即调用executor 函数, resolve 和 reject 两个函数作为参数传递给executor(executor 函数在Promise构造函数返回所建promise实例对象前被调用)。 resolve和和 reject函数被调用时,分别将promise的状态改为fulfilled(完成)或rejected(失败)。executor 内部通常
-
用最通俗的语言,由浅入深一步一个脚印,自己手写一个promise本文有点长。。 先看一个最简陋的promise let p=new Promise(function(resolev,reject){ console.log('执行') }) 这时会在浏览器打出 “执行”.... 从这里可以推断出promise的结构应该是: 定义promise,传递一个参数,这个参数 是一个函数 并包含两个方法 resolve,reject,这个函数在promise内部是立即执行的 function Promise(executor){ function resolve(){ } function reject(){ } //其实可以把这个executor看成是一个自执行函数 /* 类似 (function(resolev,reject){
-
简单实现 ES6 Promise最近在使用ES6,所以手动实现了一个简单的ES6 Promise对象来玩玩(如果有错误的地方,希望大家能够不吝赐教)一个promise对象接收的是一个callback这个callback接收两个参数(resolve,reject)当我们在callback内执行resolve或reject的时候,就会调用Promise内定义的 resolve和reject函数然后,resolve和reject函数会改变Promise的状态所以它应该是像下面这样的function MyPromise(callback) { // 保存this值 var self = this // 记录状态null为pending,true为resolved,false为reject var state = null //&nb
-
【适合收藏】让你减少加班的15条高效JS技巧!作者:陈大鱼头 github: KRISACHAN 鱼头辛苦总结的15条非常高效的JS技巧,掌握这15个JS技巧,让你减少加班次数,多抽出点时间来陪女(男)朋友。 正文 延迟函数delay const delay = ms => new Promise((resolve, reject) => setTimeout(resolve, ms)) const getData = status => new Promise((resolve, reject) => { status ? resolve('done') : reject('fail') }) const getRes = async (data) => { try { const res = await getData(data) co
reject相关课程
reject相关教程
- 3.9 reject select的相反方法:为每个数组元素运行一个表达式,如果表达式为false,则在输出中包含该元素。实例:a = [1,2,3,4,5,6,7,8,9,10].reject{|e| e==2 || e==8 }puts a.to_s# ---- 输出结果 ----[1, 3, 4, 5, 6, 7, 9, 10]
- 2. Promise.resolve () 和 Promise.reject () 前面我们已经学习了在 new Promise() 对象时执行器会提供两个回调函数,一个是 resolve 返回一个立即成功的 Promise,一个是 reject 返回一个立即失败的 Promise。在执行器中需要根据不同情况调 resolve 或 reject ,如果我们只想返回一个成功或失败的 Promise 怎么做呢?Promise 对象上的提供了 Promise.resolve(value) 和 Promise.reject(reason) 语法糖,用于只返回一个成功或失败的 Promise。下面我们看下它的对比写法:const p1 = new Promise(function(resolve, reject){ reslove(100)})const p2 = Promise.resolve(100) //和p1的写法一样const p3 = new Promise(function(resolve, reject){ reject('error')})const p4 = Promise.reject('error') //和p3的写法一样通过上面的对比 Promise.resolve(value) 创建的实例也具有 then 方法的链式调用。这里有个概念就是:如果一个函数或对象,具有 then 方法,那么他就是 thenable 对象。Promise.resolve(123).then((value) => { console.log(value);});Promise.reject(new Error('error')).then(() => { // 这里不会走 then 的成功回调}, (err) => { console.error(err);});其实,实现 Promise.resolve(value) 和 Promise.reject(reason) 的源码是很简单的。就是在 Promise 类上创建 resolve 和 reject 这个两个方法,然后去实例化一个 Promise 对象,最后分别在执行器中的 resolve() 和 reject() 函数。按照这个思路有如下实现方式:class Promise { ... resolve(value) { return new Promise((resolve, reject) => { resolve(value) }) } reject(reason) { return new Promise((resolve, reject) => { reject(reason) }) }}通过上面的实现源码我们很容易地知道,这两个方法的用法。需要注意的是 Promise.resolve(value) 中的 value 是一个 Promise 对象 或者一个 thenable 对象,Promise.reject(reason) 传入的是一个异常的原因。
- 1.8 xhr 函数 至此,我们会得到这样一个 xhr 函数:function xhr(config) { return new Promise((resolve, reject) => { const { url, method = "get", params = {}, data = null, responseType, headers, timeout } = config; const request = new XMLHttpRequest(); /** * 调用 open 方法 * method.toUpperCase() 的作用主要是讲 method 都标准统一为大写字母状态。 比如 'get'.toUpperCase() 会返回 'GET' */ request.open(method.toUpperCase(), buildUrl(url, params)); if (responseType) { // 如果设置了响应类型,则为 request 设置 responseType request.responseType = responseType; } if (timeout) { // 如果设置超时时间, 则为 request 设置 timeout request.timeout = timeout; } // 设置头部 transformHeaders(headers); Object.keys(headers).forEach(key => { if (!data && key === "Content-Type") { delete headers[key]; return; } request.setRequestHeader(key, headers[key]); }); request.onreadystatechange = function handleLoad() { if (request.readyState !== 4) return; if (request.status === 0) return; const responseData = request.responseType === "text" ? request.responseText : request.response; if (request.status >= 200 && request.status < 300 || request.status === 304) { resolve(responseData); } else { reject(new Error(`Request failed with status code ${request.status}`)); } }; request.onerror = function hadleError() { reject(new Error("Network Error")); }; request.ontimeout = function handleTimeout() { reject(new Error(`Timeout of ${timeout} ms exceeded`)); }; request.send(transformData(data)); });}
- 1.7 处理结果 // 状态变化处理函数request.onreadystatechange = function handleLoad() { if (request.readyState !== 4) return; if (request.status === 0) return; // 获取响应数据 const responseData = request.responseType === "text" ? request.responseText : request.response; if (request.status >= 200 && request.status < 300 || request.status === 304) { // 成功则 resolve 响应数组 resolve(responseData); } else { // 失败则 reject 错误原因 reject(new Error(`Request failed with status code ${request.status}`)); }};// 错误处理事件request.onerror = function hadleError() { //reject 错误原因 reject(new Error('Network Error'))}// 超时处理事件request.ontimeout = function handleTimeout() { // reject 错误原因 reject(new Error(`Timeout of ${timeout} ms exceeded`))}处理结果分为几个部分:正常处理服务端响应请求错误请求超时其中,正常处理服务端响应还要判断状态码,这里判断正确的是 200 至 300 之间状态码,再一个是 304 缓存。此时我们会通过 resolve 断言数据。否则,通过 reject 来断言失败原因。
- 3.1 实例化一个 Promise 首先需要明确 Promise 是一个类,我们在 VSCode 中输入 new Promise() 会给我们如下的提示:在 new Promise() 时需要默认需要传入一个回调函数,这个回调函数是 executor(执行器),默认会立即执行。执行器会提供两个方法(resolve 和 reject)用于改变 promise 的状态。resolve 会触发成功状态,reject 会触发失败状态,无论成功或失败都会传入一个返回值,这个返回值会在实例调用 then 方法后作为响应值获取。var promise = new Promise((resolve, reject) => { ajax(url, (data) => { resolve(data) // 成功 }, (error) => { reject(error) // 失败 })})上面的代码中实例化一个 ajax 请求的 Promise, 当接口请求成功就会调用 resolve () 方法把请求的值传入进去,如果失败了就调用 reject () 方法把错误信息传入进去。在后续的链式调用中获取相应的结果。我们需要知道的是,Promise 有三个状态:等待(padding)、成功(fulfilled),失败(rejected)。在初始化时,这个状态是等待态,在等待状态时可以转化为成功态或失败态。当状态是成功态或是失败态后不能再被改变了。上面的代码中可以改变 Promise 状态的是执行器提供的 resolve 和 reject,resolve 会将等待态变为成功态,reject 则会将等待态变为失败态,在状态变为成功或失败的状态时就不能被更改了。
- 2. 实现步骤 上一节我们已经知道了 Promise 是一个类,默认接收一个参数 executor(执行器),并且会立即执行。所以首先需要创建一个 Promise 的类,然后传入一个回调函数并执行它,故有如下的初始代码:class Promise { constructor(executor) { executor(); }}Promise 有三个状态:等待(padding)、成功(fulfilled),失败(rejected)。默认是等待状态,等待态可以突变为成功态或失败态,所以我们可以定义三个常量来存放这三个状态const PENDING = 'PENDING';const RESOLVED = 'RESOLVED'; // 成功态const REJECTED = 'REJECTED'; // 失败态class Promise { constructor(executor) { this.status = PENDING; // 默认是等待态 executor(); }}这样我们就知道了 Promise 的基本状态,那内部的状态是怎么突变为成功或失败的呢?这里执行器(executor)会提供两个个方法用于改变 Promise 的状态,所以我们需要在初始化时定义 resolve 和 reject 方法:在成功的时候会传入成功的值,在失败的时候会传入失败的原因。并且每个Promise 都会提供 then方法用于链式调用。class Promise { constructor(executor) { this.status = PENDING; const resolve = (value) => {}; const reject = (reason) => {}; // 执行executor时,传入成功或失败的回调 executor(resolve, reject); } then(onfulfilled, onrejected) { }}这时我们就可以开始着手去更改 Promise的状态了,由于默认情况下 Promise 的状态只能从 pending 到 fulfilled 和 rejected 的转化。class Promise { constructor(executor) { this.status = PENDING; const resolve = (value) => { // 只有等待态时才能更改状态 if (this.status === PENDING) { this.status = RESOLVED; } }; const reject = (reason) => { if (this.status === PENDING) { this.status = REJECTED; } }; executor(resolve, reject); } ...}成功和失败都会返回对应的结果,所以我们需要定义成功的值和失败的原因两个全局变量,用于存放返回的结果。class Promise { constructor(executor) { this.status = PENDING; this.value = undefined; this.reason = undefined; const resolve = (value) => { // 只有等待态时才能更改状态 if (this.status === PENDING) { this.value = value; this.status = RESOLVED; } }; const reject = (reason) => { if (this.status === PENDING) { this.reason = reason; this.status = REJECTED; } }; executor(resolve, reject); } ...}这时我们就已经为执行器提供了两个回调函数了,如果在执行器执行时抛出异常时,我们需要使用 try…catch 来补货一下。由于是抛出异常,所以,需要调用 reject 方法来修改为失败的状态。try { executor(resolve, reject);} catch(e) { reject(e)}我们知道实例在调用 then 方法时会传入两个回调函数 onfulfilled, onrejected 去执行成功或失败的回调,所以根据状态会调用对应的函数来处理。then(onfulfilled, onrejected) { if (this.status === RESOLVED) { onfulfilled(this.value) } if (this.status === REJECTED) { onrejected(this.reason) }}这样我们就完了 Promise 最基本的同步功能,let promise = new Promise((resolve, reject) => { resolve('value'); // throw new Error('错误'); // reject('error reason') // setTimeout(() => { // resolve('value'); // }, 1000)})promise.then((data) => { console.log('resolve response', data);}, (err) => { console.log('reject response', err);})用上面的代码对我们写的 Promise 进行验证,通过测试用例可知,我们写的 Promise 只能在同步中运行,当我们使用 setTimeout 异步去返回时,并没有预想的在then的成功回调中打印结果。对于这种异步行为需要专门处理,如何处理异步的内容呢?我们知道在执行异步任务时 Promise 的状态并没有被改变,也就是并没有执行 resolve 或 reject 方法,但是 then 中的回调已经执行了,这时就需要增加当 Promise 还是等待态的逻辑,在等待态时把回调函数都存放起来,等到执行 resolve 或 reject 再依次执行之前存放的then的回调函数,也就是我们平时用到的发布订阅模式。实现步骤:首先,需要在初始化中增加存放成功的回调函数和存放失败的回调函数;然后,由于是异步执行 resolve 或 reject 所以需要在 then 方法中把回调函数存放起来;最后,当执行 resolve 或 reject 时取出存放的回调函数依次执行。根据以上的实现步骤可以得到如下的代码:class Promise { constructor(executor) { this.status = PENDING; this.value = undefined; // 成功的值 this.reason = undefined; // 失败的原因+ // 存放成功的回调函数+ this.onResolvedCallbacks = [];+ // 存放失败的回调函数+ this.onRejectedCallbacks = []; let resolve = (value) => { if (this.status === PENDING) { this.value = value; this.status = RESOLVED;+ // 异步时,存放在成功的回调函数依次执行+ this.onResolvedCallbacks.forEach(fn => fn()) } }; let reject = (reason) => { if (this.status === PENDING) { this.value = reason; this.status = REJECTED;+ // 异步时,存放在失败的回调函数依次执行+ this.onRejectedCallbacks.forEach(fn => fn()) } }; try { executor(resolve, reject); } catch(e) { reject(e) } } then(onfulfilled, onrejected) { if (this.status === RESOLVED) { onfulfilled(this.value) } if (this.status === REJECTED) { onrejected(this.reason) }+ if (this.status === PENDING) {+ this.onResolvedCallbacks.push(() => {+ // TODO+ onfulfilled(this.value);+ })+ this.onRejectedCallbacks.push(() => {+ // TODO+ onrejected(this.reason);+ })+ } }}上面的代码中,在存放回调函数时把 onfulfilled, onrejected 存放在一个函数中执行,这样的好处是可以在前面增加处理问题的逻辑。这样我们就完成了处理异步的 Promise 逻辑。下面是测试用例,可以正常的执行 then 的成功回调函数。let promise = new Promise((resolve, reject) => { setTimeout(() => { resolve('100'); }, 1000)})promise.then((data) => { console.log('resolve response:', data); // resolve response: 100}, (err) => { console.log('reject response:', err);})到这里我们是不是已经基本实现了 Promise 的功能呢?ES6 中的 then 方法支持链式调用,那我们写的可以吗?我们在看下面的一个测试用例:let promise = new Promise((resolve, reject) => { setTimeout(() => { resolve('100'); }, 1000)})promise.then((data) => { console.log('resolve response:', data); // resolve response: 100 return 200}, (err) => { console.log('reject response:', err);}).then((data) => { console.log('data2:', data)}, null)// TypeError: Cannot read property 'then' of undefined然而当我们在执行的时候会报错,then 是 undefined。为什么会这样呢?那我们要知道如何满足链式调用的规范,那就是在完成任务后再返回一个Promise 实例。那如何返回一个 Promise 实例呢?在 Promise A+ 规范的 2.2.7 小节在有详细的描述,再实例化一个 promise2 来存放执行后的结果,并返回 promise2。那么我们就要改造 then 方法了。class Promise { ... then(onfulfilled, onrejected) { let promise2 = new Promise((resolve, reject) => { if (this.status === RESOLVED) { const x = onfulfilled(this.value) resolve(x) } if (this.status === REJECTED) { const x = onrejected(this.reason); reject(x) } if (this.status === PENDING) { this.onResolvedCallbacks.push(() => { const x = onfulfilled(this.value) resolve(x) }) this.onRejectedCallbacks.push(() => { const x = onrejected(this.reason); reject(x) }) } }) return promise2 }}再使用上面的测试用例,就可以得到正确的结果:let promise = new Promise((resolve, reject) => { resolve('100');})promise.then((data) => { console.log('data1:', data); // data1: 100 return 200}, null).then((data) => { console.log('data2:', data); // data2: 200 throw new Error('error')}, null).then(null, () => { consol.log('程序报错...')})上面的测试用例中,当 then 的回调函数抛出异常时需要去捕获错误,传到下一个 then 的失败回调函数中。class Promise { ... then(onfulfilled, onrejected) { let promise2 = new Promise((resolve, reject) => { if (this.status === RESOLVED) { try{ const x = onfulfilled(this.value) resolve(x) } catch(e) { reject(e) } } if (this.status === REJECTED) { try{ const x = onrejected(this.reason); resolve(x) } catch(e) { reject(e) } } if (this.status === PENDING) { this.onResolvedCallbacks.push(() => { try{ const x = onfulfilled(this.value) resolve(x) } catch(e) { reject(e) } }) this.onRejectedCallbacks.push(() => { try{ const x = onrejected(this.reason); resolve(x) } catch(e) { reject(e) } }) } }) return promise2 }}到这里为止我们就已经实现了一个简版的 Promise,因为Promise是一个规范,很多人都可以实现自己的 Promise 所以 Promise A+ 规范做了很多兼容处理的要求,如果想实现一个完整的 Promise 可以参考 Promise A+ 规范 。
reject相关搜索
-
radio
radiobutton
radiobuttonlist
radiogroup
radio选中
radius
rails
raise
rand
random_shuffle
randomflip
random函数
rangevalidator
rarlinux
ratio
razor
react
react native
react native android
react native 中文