ES6Promise对象--像同步代码一样写异步代码如有侵权,请联系我删除,谢谢!简介从句法上讲,Promise是一个对象,可以从中获取异步操作的消息。Promise提供了统一的API,各种异步操作可以统一处理。通俗地说,Promise是一个容器,用来存放异步操作的结果。特征对象的状态不受外界影响。Promise对象有三种状态:pending(进行中)、fulfilled(成功)和rejected(失败)。只有异步操作的结果才能确定当前处于哪个状态,其他任何操作都不能改变这个状态。状态一旦改变,就不会再改变。这个结果可以随时得到。Promise对象的状态变化只有两种可能:从pending到fulfilled和从pending到rejected。只要这两种情况发生,状态就会被冻结,不会再发生变化,永远保持这个结果。这时候就叫解决了。优缺点优点1、Promise对象可以在同步操作的过程中表达异步操作,以同步的方式编写异步代码,避免层层嵌套回调函数。2、Promise对象提供了统一的接口,更容易控制异步操作??。缺点1.Promise不能取消。一旦创建,将立即执行,不能中途取消。2.如果不设置回调函数,Promise内部抛出的错误不会反映到外部。3.第三,当它处于pending状态时,无法知道它进展到哪个阶段(刚刚开始或即将完成)。CasePromise实例Promise构造函数接受一个函数作为参数,函数的两个参数分别是resolve和reject。注意这两个是两个函数。constpromise=newPromise(function(resolve,reject){//...一些代码if(/*异步操作成功*/){resolve(value);}else{reject(error);}});resolvefunction作用是将Promise对象的状态从“未完成”变为“成功”(即从pending变为resolved),异步操作成功时调用,并将异步操作的结果作为参数传递;reject函数作用是将Promise对象的状态从“未完成”变为“失败”(即从pending变为rejected),在异步操作失败时调用,将异步操作上报的错误作为一个范围。PromiseExecutionOrder一旦一个Promise被创建,它就会被立即执行。让promise=newPromise(function(resolve,reject){console.log('11');resolve();});promise.then(function(){console.log('22');});console.log('33');//11//33//22Promise创建后立即执行,所以第一个输出11.then方法指定的回调函数是异步函数,之后会执行当前脚本中的所有同步任务都执行完毕,所以最终输出33和22。异步图片加载案例使用Promise封装了一个图片加载的异步操作。如果加载成功,则调用resolve方法,否则调用reject方法。functionloadImageAsync(url){returnnewPromise(function(resolve,reject){constimage=newImage();image.onload=function(){resolve(image);};image.onerror=function(){reject(newError('Couldnotloadimageat'+url));};image.src=url;});}Promise对象实现的Ajax在getTest函数中封装了XMLHttpRequest对象,发送HTTP请求,获取一个承诺对象。constgetTest=function(url){constpromise=newPromise(function(resolve,reject){consthandler=function(){if(this.readyState!==4){return;}if(this.status===200){resolve(this.response);}else{reject(newError(this.statusText));}};constclient=newXMLHttpRequest();client.open("GET",url);client.onreadystatechange=处理程序;client.responseType="json";client.setRequestHeader("Accept","application/json");client.send();});returnpromise;};//调用案例getTest("/test.json").then(function(json){console.log('Contents:'+json);},function(error){console.error(error);});Promise错误处理如果Promise状态已经变为resolved,重新抛出错误是无效的。因为Promise的状态一旦改变,就会永远保持这个状态,不会再改变。Promise对象的错误具有冒泡的性质,并且会向后传播直到被捕获。也就是说,错误总是会被下一个catch语句捕获。constpromise=newPromise(function(resolve,reject){resolve('ok');thrownewError('test');});promise.then(function(value){console.log(value)})。catch(function(error){console.log(error)});//ok感谢大神网络阮一峰的es6语法教程和辛勤的自己,个人博客,github
