从C#到TypeScript - Promise 背景 相信之前用过JavaScript的朋友都碰到过异步回调地狱(callback hell),N多个回调的嵌套不仅让代码读起来十分困难,维护起来也很不方便...这两种转换都是由异步返回的结果给定的,成功取回数据就是resolved,取数据出异常就是rejected。...Promise不能在任务进行中取消,只能等结果返回,这点上不如C#的Task,Task可以通过CancelTaskToken来取消任务。...(error); }).then(()=>console.info('finish')); 嵌套的Promise 在实际场景中,我们可能需要在一个异步操作后再接个异步操作,这样就会有Promise的嵌套操作...下面的代码显示的是Promise的嵌套操作: p1先打印"start",延时两秒打印"p1"。 p2在p1完成后延时两秒打印"p2"。
Promise的两个特点: 对象的状态不受外界影响。Promise对象获取的是异步操作,有三种状态:pending(进行中)、fulfilled(已成功)、reject(已失败)。...从pending变为fulfilled和从pending变为rejected状态,只要处于fulfilled和rejected,状态就不会再变。...状态的缺点: 无法取消Promise,一旦新建它就会立即执行,无法中途取消。 如果不设置回调函数,Promise内部抛出错误,不会反应到外部。...Promise的优点 指定回调函数的方式更加灵活。 支持链式调用,可以解决回调地狱问题。回调地狱就是回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调函数的执行条件。...回调地狱的缺点是不便于阅读和异常处理。 Promise的缺点 无法取消Promise,一旦新建就会立即执行,无法暂停和取消。 如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。
Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。...如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。 3.优点 有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。...此外,Promise对象提供统一的接口,使得控制异步操作更加容易。 4.缺点 首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。...1.回调地狱问题 2.代码的可读性问题 3.信任问题 什么是回调地狱 所谓回调地狱就是指把函数作为参数层层嵌套请求,这样层层嵌套,人们称之为回调地狱,代码阅读性非常差。...,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
Promise 状态 Promise 异步操作有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。...除了异步操作的结果,任何其他操作都无法改变这个状态。 Promise 对象只有:从 pending 变为 fulfilled 和从 pending 变为 rejected 的状态改变。...无法取消 Promise ,一旦新建它就会立即执行,无法中途取消。...如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。 当处于 pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。...then 方法注意点 简便的 Promise 链式编程最好保持扁平化,不要嵌套 Promise。 注意总是返回或终止 Promise 链。
someFunction, value) { someFunction(value); } execute(say, 'hello word'); say函数作为参数传递给execute函数,一般来说我们会碰到的回调嵌套都不会很多...,一般就一到两级,但是某些情况下,回调嵌套很多时,代码就会非常繁琐,会给我们的编程带来很多的麻烦,这种情况俗称——地狱回调。...Promise正如字面意思-承诺,“承诺将来会执行”约定的事情。我们首先需要了解Promise的三种状态: pending: 初始状态,既不是成功,也不是失败状态。...Resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去; Reject...函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
Promise 对象的状态改变,只有两种可能:从 Pending 变为 Resolved 和从 Pending 变为 Rejected。...有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供统一的接口,使得控制异步操作更加容易。 Promise也有一些缺点。...首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。...回调地狱 回掉函数中嵌套回调,Promise解决了回调地狱。...: 失败函数 Promise实例 promise实例有两个属性 state: 状态 result: 结果 Promise的状态 第一种状态: pending 第二种状态: fulfilled 第三种状态
promise是异步编程的一种解决方案: 从语法上讲,promise是一个对象,从它可以获取异步操作的消息; 从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。...promise有三种状态: pending(等待态),fulfiled(成功态),rejected(失败态); Promise有以上三种状态,只有异步操作的结果可以决定当前是哪一种状态...,其他任何操作都无法改变这个状态 状态一旦改变,就不会再变,任何时候都可以得到这个结果,状态不可以逆,只能由 pending变成fulfilled或者由pending变成rejected...一般来说我们会碰到的回调嵌套都不会很多,一般就一到两级,但是某些情况下,回调嵌套很多时,代码就会非常繁琐,会给我们的编程带来很多的麻烦,这种情况俗称回调地狱。...promise是用来解决两个问题的: 1、回调地狱,代码难以维护,常常第一个的函数的输出是第二个函数的输入这种现象 2、promise可以支持多个并发的请求,获取并发请求中的数据
Hello小伙伴们,今天和大家分享的是Promise对象! Promise Promise基础用法 Promise是什么呢,是用来解决异步编程的一种方案。...相比于传统层层嵌套的解决方法,能够将异步操作以同步操作的流程表达出来,更加清晰。但是,Promise一旦被建立,就会被执行,而无法中途取消。...Promise的特点: 1)对象的状态不受外界影响,当异步操作产生结果的时候,就会决定操作状态:pending、fulfilled和rejected三种状态,分别代表正在进行中、操作已经成功、操作失败了...2)而且状态只能从pending到fulfilled和从pending到rejected两种状态,一旦状态变为这两种,就不能够再改变了。 Promise实例的创建: ?...Promise对象能够接收resolve和reject作为参数,异步操作成功的时候,resolve能够将Promise对象的状态从pending到resolve;异步操作失败的时候,从pending变为
相比以前如果异步广度较大时会出现较深的回调嵌套,从而导致代码难写难维护,Promise/Deferred模式采用的先异步后处理回调在一定程度上缓解这个问题。...Promise对象的改变,只有两种可能:从pending到fulfilled、从pending到rejected。只要这两种状态之一发生了,状态就凝固,不会再改变,会一直保持这个结果。...通过Promise对象,可以把异步操作以同步操作的流程表达出来,避免层层嵌套的回调函数。...注意Promise对象一旦新建就会立即执行,并且无法中途取消;并且如果不设置回调函数,Promise内部抛出的错误,也不会反应到外部;当处于pending状态时,无法得知目前进展到哪一阶段(刚开始还是即将完成...使用统一标准后的ES6 Promise来进行异步编程,比之事件发布订阅模式或之前在野Promise/Differred模式规范要好的多,但仍有些不足,比如Promise对象一旦中途执行就无法取消或暂停,
Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。...有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供统一的接口,使得控制异步操作更加容易。...Promise的缺点 Promise也有一些缺点。 首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。...每个promise都会经历一个短暂的生命周期:先是出于进行中(pending)的状态,此时操作尚未完成,所以它是未处理的,一旦异步操作执行结束,promise则变为已处理的状态。...一旦promise状态改变,就不会再变,任何时候都可以得到这个结果。promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。
bug,所以不可信任 2、 回调嵌套(回调地狱) 02 promise 后面我们使用promise来进行解决,以then操作的形式,进行链式操作,而不再是回调地狱 promise的缺点 1、 promise...一旦新建就会立即执行,无法中途取消 但是我们思考到了几种方式来中断 promise 请求 1.1、 promsie.race方法 1.2、 promise中抛出异常,被catch方法捕捉 1.3、 Promises...利用这一特性,当新对象保持“pending”状态时,原Promise链将会中止执行。...Promise.resolve().then(() => { console.log('ok1') return new Promise(()=>{}) // 返回“pending”状态的Promise...已经脱离了try…catch的执行栈和上下文 3、当处于pending状态时,无法得知当前处于哪一个状态,是刚刚开始还是刚刚结束 4、 如果 Promise 连续调用,对于错误的处理是很麻烦的。
特点 对象的状态不受外界影响 (3种状态) Pending状态(进行中) Fulfilled状态(已成功) Rejected状态(已失败) 一旦状态改变就不会再变 (两种状态改变:成功或失败) Pending...-> Fulfilled Pending -> Rejected 用法 创建Promise实例 var promise = new Promise(function(resolve, reject)...resolve作用是将Promise对象状态由“未完成”变为“成功”,也就是 Pending->Fulfilled,在异步操作成功时调用,并将异步操作的结果作为参数传递出去;而reject函数则是将Promise...对象状态由“未完成”变为“失败”,也就是 Pending->Rejected,在异步操作失败时调用,并将异步操作的结果作为参数传递出去。...在该函数中,利用await来等待一个Promise。 Promise优缺点 优点 缺点 解决回调 无法监测进行状态 链式调用 新建立即执行且无法取消 减少嵌套 内部错误无法抛出
doE();} ); doF(); 当然这是一种简化的形式,经过一番简单的思考,我们可以判断出执行的顺序为: doA()doF()doB()doC()doE()doD() 然而在实际的项目中,代码会更加杂乱...当然之所以导致这个问题,其实是因为这种嵌套的书写方式跟人线性的思考方式相违和,以至于我们要多花一些精力去思考真正的执行顺序,嵌套和缩进只是这个思考过程中转移注意力的细枝末节而已。...,将 A 函数执行上下文出栈。...此外外层的变量,也可能被其它同一作用域的函数访问并且修改,容易造成误操作。 之所以单独讲讲回调地狱,其实是想说嵌套和缩进只是回调地狱的一个梗而已,它导致的问题远非嵌套导致的可读性降低而已。...无法取消 Promise 一旦新建它就会立即执行,无法中途取消。 4. 无法得知 pending 状态 当处于 pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
setTimeout(() => { console.log('ok') },2000) } })})上述代码通过回调函数的嵌套...Promise对象Promise对象用于表示一个异步操作的最终状态(完成或失败),以及其返回的值。...MDN对Promise定义如上,Promise本意为承诺,我们可以理解为程序承诺过一段时间后会给你一个结果。Promise是一个对象,可以保存三个状态 每一时刻必须有一个状态。...成功 Fulfilled失败 Rejected处理中 Pending默认 pending 如果调用 resolve fulfilled默认 pending 如果调用 reject rejeced 图片...但其实,Promise的真正强大之处在于它的多重链式调用,可以避免层层嵌套回调。 我们先使用new来构建一个promise。
{ func2() } } func1(11, function() { console.log('this is a callback') }) 一般来说我们会碰到的回调嵌套都不会很多...,一般就一到两级,但是某些情况下,回调嵌套很多时,代码就会非常繁琐,会给我们的编程带来很多的麻烦,这种情况俗称——回调地狱。...Promise是异步编程的一种解决方案,它有三种状态,分别是pending-进行中、resolved-已完成、rejected-已失败 当Promise的状态又pending转变为resolved或rejected...(a) // pending ——> resolved 参数将传递给对应的回调方法 } else { reject(err) // pending ——> rejectd...= new Promise ( ... ) p3.then( () => return p4 ) p1异步方法中返回p2 p1的状态取决于p2,如果p2为pending,p1将等待p2状态的改变
特点 对象的状态不受外界影响 (3种状态) Pending状态(进行中) Fulfilled状态(已成功) Rejected状态(已失败) 一旦状态改变就不会再变 (两种状态改变:成功或失败)...Pending -> Fulfilled Pending -> Rejected 用法 创建Promise实例 var promise = new Promise(function(resolve...resolve作用是将Promise对象状态由“未完成”变为“成功”,也就是Pending -> Fulfilled,在异步操作成功时调用,并将异步操作的结果作为参数传递出去;而reject函数则是将Promise...对象状态由“未完成”变为“失败”,也就是Pending -> Rejected,在异步操作失败时调用,并将异步操作的结果作为参数传递出去。...在该函数中,利用await来等待一个Promise。 Promise优缺点 优点 缺点 解决回调 无法监测进行状态 链式调用 新建立即执行且无法取消 减少嵌套 内部错误无法抛出
1)对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成,又称 Fulfilled)和Rejected(已失败)。...Promise对象的状态改变,只有两种可能:从Pending变为Resolved和从Pending变为Rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。...有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供统一的接口,使得控制异步操作更加容易。 Promise也有一些缺点。...首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。...,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;reject函数的作用是,将Promise
Promise 对象的状态改变,只有两种可能:从 Pending 变为 Resolved 和从 Pending 变为 Rejected。...有了 Promise 对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise 对象提供统一的接口,使得控制异步操作更加容易。 Promise 也有一些缺点。...首先,无法取消 Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。...如果异步操作成功,则用 resolve 方法将 Promise 对象的状态,从「未完成」变为「成功」(即从 pending 变为 resolved); 如果异步操作失败,则用 reject 方法将 Promise...对象的状态,从「未完成」变为「失败」(即从 pending 变为 rejected)。
领取专属 10元无门槛券
手把手带您无忧上云