rejected相关知识
-
github 常见异常1 Push to origin /master was rejected参考:https://stackoverflow.com/questions/40142180/android-studio-git-push-rejected2 failed to push some refs to描述:$ git push -u origin masterTo git@github.com:******/Demo.git ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to 'git@github.com:******/Demo.git' hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. Merge th
-
Promise入门一、生命周期 Promise生命周期中有三个状态 进行中(pending) 成功(resolved) 拒绝(rejected) pending代表promise进入未处理(处理中)状态,一旦promise生命周期结束就会变为:resolved和rejected状态其中之一,resolved代表处理成功,rejected代表处理被拒绝;而且Promise一旦状态改变就不会变,promise改变状态的结果只有2种可能: pending => resolved // 成功 pending => rejected // 失败 二、创建Promise 可以使用Promise构造函数创建Promise,构造函数接收2个参数
-
Promise源码分析Promise源码分析 代码如下: /* 我们要满足状态只能三种状态:PENDING,FULFILLED,REJECTED三种状态,且状态只能由PENDING=>FULFILLED,或者PENDING=>REJECTED */ var PENDING = 0; var FULFILLED = 1; var REJECTED = 2; /* value状态为执行成功事件的入参,deferreds保存着状态改变之后的需要处理的函数以及promise子节点,构造函数里面应该包含这三个属性的初始化 */ function Promise(callback) { this.status = PENDING; this.value = null; this.defferd = [
-
说说你对Promise的理解?依照 Promise/A+ 的定义,Promise 有四种状态:pending: 初始状态, 非 fulfilled 或 rejected.fulfilled: 成功的操作.rejected: 失败的操作.settled: Promise已被fulfilled或rejected,且不是pending另外, fulfilled 与 rejected 一起合称 settled。Promise 对象用来进行延迟(deferred) 和异步(asynchronous ) 计算。Promise 的构造函数构造一个 Promise,最基本的用法如下:var promise = new Promise(function(resolve, reject) {if (...) { // succeedresolve(result);} else { // failsreject(Error(
rejected相关课程
rejected相关教程
- 4. 枚举的类型兼容性 枚举与数字类型相互兼容:enum Status { Pending, Resolved, Rejected}let current = Status.Pendinglet num = 0current = numnum = current不同枚举类型之间是不兼容的:enum Status { Pending, Resolved, Rejected }enum Color { Red, Blue, Green }let current = Status.Pendingcurrent = Color.Red // Error
- 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+ 规范 。
- 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 则会将等待态变为失败态,在状态变为成功或失败的状态时就不能被更改了。
- 6.2 Rebase 分支 正如他的名字所隐含的意思:rebase存在的价值是:对一个分支做“变基”操作,这意味着改变这个branch的初始commi。它会在新的base上一个一个地运行这个分支上的所有commits。这个概念理解起来可能稍微有点困难,请参考官网 git-rebase, 里面有更详尽的介绍。比如当我试图将本地 xuxh 分支的改变 commit and push到remote对应分支时,被拒绝了,原因是自从上次和origin同步(通过git pull)后, remote xuxh分支又有了新的改变。这种情况下,如果我们强行将我们的代码push过去将会覆盖remote 分支上代码,而这往往是不允许的,所以push总会给出下面的提示点击Rebase, 弹出下面的 Conflicts 窗口, 通常都会选择 Merge… 。如果选择 Accept Yours, 相当于把本地代码强行推到远程分支,会覆盖远程分支上一些改变,选择 Accept Theirs, 相当于放弃本地的改变。选择Merge… , 下面的窗口会列出分支的不同根据代码的情况,进行合并,然后点击Apply, 查看本地代码,远程改变已经合并到本地。在event log 工具栏会看类似的信息:**11:52 AM Push rejected Push has been cancelled, because there were conflicts during update. Check that conflicts were resolved correctly, and invoke push again. View received commits**第一次的Push 操作已经取消了, 上面的操作已经与远程分支同步了,此时再次 Push 代码就能正常了。【注意】通常我们只建议在自己的私有分支上做rebase, 永远不要rebase一个已经分享的分支,比如rebase到master,develop,release分支上,如果几个人对同一个分支做了rebase 以后,会造成后来的push 与同步困难,还有许多相同的changeset。前面讲了同一分支上的 rebase,我们也可以基于另一分支上作同样的“变基”操作,xuxh 个人分支是从master 创建的, 当我们在个人分支上开发的时候,master 分支可能一直在变化,此时可以通过rebase 把 master 最新代码 merge 到个人分支上。主菜单: VCS -> Git -> Rebase。后面的操作与前面介绍的一致,会有 conflics 窗口弹出,然后 merge 代码,然后点击rebase。rebase 成功后会在 Event log 显示类似的信息。12:22 PM Rebase Successful: Rebased xuxh on refs/heads/master
- 2. Hystrix 服务监控平台基础使用介绍 整个 Hystrix 微服务监控平台分为平台首页和平台内容页,在平台首页,我们需要配置被监控项目的信息,包括被监控项目的地址、获取被监控项目参数的间隔时间,以及服务监控平台的标题。在平台内容页才是我们真正查看被监控项目之参数的地方,接下来就让我们先看平台首页中都有哪些内容。平台首页Hystrix 微服务监控平台登录界面如下图所示:Hystrix Dashboard 登录界面我们按照图中字母顺序依次进行介绍。1 表示需要进行监控的服务访问地址。2 表示获取服务监控信息的刷新频率,即间隔多长时间之后重新获取被监控服务的信息。3 表示进入微服务监控平台之后,所展示的标题名称,往往这里会被设置为项目的名称。4 表示进入微服务监控平台的按钮,当我们将 1 2 3 的信息都填写正确之后,点击 4 按钮,即可进入微服务监控平台内容页面,如果 1 2 3 信息中有一项填写错误,则在微服务监控平台的内容页面就无法看到任何服务监控信息。Tips: 上面的 1 2 3 项中,只有 1 是必填项,如果 2 3 没有填写,则 Hystrix 会启用默认的配置进入微服务监控平台。平台首页一共就需要我们了解以上这些信息就可以了,接着我们来看平台内容页。平台内容页Hystrix Dashboard 内容页面整个平台内容页面被分为了 Circuit 和 Thread Pools 两部分,分别表示项目熔断的监控,以及项目线程池的监控。我们首先来看平台内容界面的 Circuit 部分。上图中,在 Circuit 部分的右上角位置,我用箭头标出了每个名词的对应关系,接下来我们一一来说明。success : 表示请求服务成功的数量。short-circuited : 表示请求服务被熔断的请求数量。bad request : 表示不能访问的请求的数量。timeout : 表示请求服务时,服务超时的请求数量。rejected :表示请求服务时,被拒绝的请求数量。failure :表示请求服务时,请求失败的数量。error :表示请求服务时,错误的服务的数量。然后,我们接着来看,在 Circuit 部分的中间位置,有一个 Circuit 的单词,该单词表示被监控项目此时的断路器的状态,当 Circuit 的值为 Closed 时,表示当前项目的断路器处于关闭状态,即当前服务的项目熔断没有启用。当项目的断路器打开时,此时的 Circuit 的值为 Open ,表示,此刻当前被监控的项目使用了服务熔断机制。在 Circuit 单词的上方,还有两个重要的参数,分别是:Host、Cluster ,Host 表示当前被监控项目的主机的请求频率,Cluster 表示当前被监控项目的项目集群的请求频率。Circuit 部分的左上方是一个图标,其由实心圆和曲线组成,其中,实心圆会根据实例的健康程度来改变自身的颜色,健康程度从绿色、黄色、橙色、红色递减,而实心圆的大小则表示请求流量的变化,流量越大该实心圆就越大,所以可以在大量的实例中快速发现故障实例和高压实例。曲线则记录了在 2 分钟内请求流量的相对变化程度,可以通过它来观察流量的上升和下降趋势。Tips: 由于本项目只是用来演示,并没有请求流量产生,所以这里就不会出现曲线,当我们有请求过来时,曲线就会发生变化。Circuit 部分最下面的 Hosts 、Median 、 Mean 我们不需要可以去了解分别代表什么含义,我们只需要知道这三个参数都是用来表示延迟时间的就可以了。最后,我们来看平台内容页的 Thread Pools 部分。在 Thread Pools 部分的左上方,同样也有一个由实心圆和曲线所构成的图标,其含义同 Circuit 部分的图标,这里不再赘述。在 Thread Pools 图标的右侧,同样也有 Host 和 Cluster 的请求频率的记录,这个和 Circuit 部分也是一样的。在 Thread Pools 图标的下方,有两列非常重要的参数,如下图:Hystrix Dashboard-Thread Pools 重点监控属性Active : 表示当前活跃的线程数量。Max Active : 表示当前最大活跃线程数量。Queued : 表示当前线程等待队列中的线程数量。Executios : 表示正在执行的线程的数量。Pool Size : 表示当前线程池的大小。Queue Size : 表示当前线程等待队列的长度。最后,我们再来看一下 Circuit 部分和 Thread Pools 部分的最上方位置,均有一个 Sort 名词,在这个名词的后面,也有很多单词,这表示我们查看服务监控参数时的顺序,当我们点击后面的一个单词时,HystrixDashboard 就会根据我们所点击的单词来对服务监控参数进行一个排序,仅此而已。Tips: Thread Pools 部分可以为我们展示被监控项目中线程池的活跃状态,我们可以直接从这些参数中分析出来当前线程池的活跃程度,从而动态地去调整每个微服务项目的线程池内容。
- 11-28 zuul - 配置路由 Spring Cloud分布式微服务实战
rejected相关搜索
-
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 中文