当前位置: 首页 > 科技观察

Promise对象的基本介绍

时间:2023-03-13 14:51:12 科技观察

今天就来了解一下Promise吧!其实这也是笔试中的一个考点。基本介绍Promise对象是CommonJS(熟悉的名字--)工作组提出的规范。Promise最初只是社区提出的一个想法。一些外部函数库率先实现了这个功能,并在ES6中写入了语言标准。目的:什么是为异步操作提供统一接口的Promise?它是javascript中的一个对象,充当代理,充当异步操作和回调函数之间的中介。避免产生类似这样的嵌套地狱。让我们的代码变得更简单易读使用Promise,大家都认同(newPromise(f1).then(f2));总结:Promise让异步操作向下发展变得水平化,程序流程变得清晰易读。基本思想是一个异步任务返回一个Promise对象,它有三种状态:1.pending(未完成)2.resolved,fulfilled(完成)3.rejected(失败)它有两种变化方式1.pending-->resolved/fulfilled2.pending-->rejected有两种结果1.异步操作成功,返回值,状态变为resolved2.异步操作失败,抛出错误,状态变为rejectedPromise使用.then()方法添加一个回调函数,然后Receive两个回调函数,第一个是成功的回调函数,一个是失败的回调函数。主要是在状态发生变化时调用相应的回调函数。然后可以链式调用。基本上使用Promise构造函数接受一个函数作为参数,函数的两个参数是resolve和reject。它们由JS引擎提供,不需要自己部署。Promise(function(resolve,reject){})resolve的作用是:将Promise对象从未完成变为成功(Pending->Resolved),异步操作成功时调用,将异步操作的结果作为一个范围。reject的作用是:将Promise对象从未完成变为失败(Pending->Rejected),异步操作失败时调用,将异步操作报错作为参数传递。Promise.then()方法可以用来指定Resolved状态和Reject状态的回调函数。promise.then(function(value){//成功+_+!},function(value){//失败Q_Q});当我们只想处理异常时,我们可以使用promise.then(undefined,onRejected),或者promise.catch(onRejected)!笔记!这里有一个陷阱。接下来,我们将在深入部分解释Promise.all()方法接受一个promise对象数组作为参数。当数组中的所有Promise对象都变为resolve/reject时,将调用.then方法,同时启动传入的promise并并行执行。promise.all([promise1,promise2,.....]);Promise.race()方法和Promise.all()方法一样接受一个promise对象数组作为参数,但是数组中有一个promise对象进入fulfilled或者rejected状态就会开始后续的处理。promise.race([承诺1,承诺2,...]);相关语法糖Promise.resolve(42);//等价于newPromise(function(resolve){resolve(42);});Promise.reject(newError("发生错误"));//等价于newPromise(function(解决,拒绝){拒绝(newError(“错误”));});Thenable对象与Promise非常相似,并且具有.then方法。经典的例子就是jQuery.ajax()返回的值是thenable的.varpromise=Promise.resolve($.ajax('/json/comment.json'));这样就可以将thenable对象转化为promise对象。传送门:Promise.resolve()关于promise设计:始终异步操作。你可以通过查看代码来理解这里的问题。varpromise=newPromise(function(resolve){console.log("innerpromise");//1resolve(42);});promise.then(function(value){console.log(value);//3});console.log("outerpromise");//2//结果是/*innerpromise//1outerpromise//242//3*/可以看出即使我们调用promise.then的时候promise对象已经确定了,Promise会异步调用回调函数,这是Promise设计的规定策略。关于调用then/catch每次调用then/catch,都会返回一个promise对象此时我们可以通过===来判断每个promise对象其实是不一样的。then和catch的错误处理区别结合上一点就很好理解了。我们直接上图,从JavaScriptPromise小书(中文版)中结合我们的代码//<1>onRejected不会被调用functionbadMain(onRejected){returnPromise.resolve(42).then(throwError,onRejected);}//<2>在onRejected调用时会出现异常functiongoodMain(onRejected){returnPromise.resolve(42).then(throwError).catch(onRejected);}在onFullfilled中出现的错误,比如错误在<1>中的throwError,不会引起onRejectedExecution(捕获异常),我们只能在后面通过catch方法捕获。基础应用的不兼容是使用polyfill。对于IE8及以后的版本,catch会导致identifiernotbecauseitisareservedwordinES3found错误,对此我们可以使用["catch"]或者then(undefined,function(){})来catch,有些class库使用caught作为函数名来避免这个问题。值得注意的是,.catch自带的压缩工具有很多["catch"]应用示例:loadimagevarpreloadImage=function(path){returnnewPromise(function(resolve,reject){varimage=newImage();image.onload=resolve;image.onerror=reject;image.src=path;})}preloadImage("https://dn-anything-about-doc.qbox.me/teacher/QianDuan.png").then(函数(){alert("图片加载成功");},function(){alert("图片加载失败");})Ajax操作functionsearch(term){varurl='http://example.com/search?q='+term;varxhr=newXMLHttpRequest();varresult;varp=newPromise(function(resolve,reject){xhr.open('GET',url,true);xhr.onload=function(e){if(this.status===200){result=JSON.parse(this.responseText);resolve(result);}};xhr.onerror=function(e){reject(e);};xhr.send();});returnp;}search("HelloWorld").then(控制台.log,console.error);回到开头,其实Promise对象的优势在于标准的链式调用,可以清晰的看到程序流程。并且还可以定义统一的错误处理方式