promise到底怎么理解
Promise的含义
promise是异步编程的⼀种解决⽅法。
所谓promise,简单说是⼀个容器,⾥⾯保存着某个未来才会结束的事件(通常是⼀个异步操作)的结果,从语法上说,promise是⼀个对象,从它可以获取异步操作的消息,promise提供了统⼀的API,各种异步操作都可以⽤同样的⽅法进⾏处理。
Promise对象的特点
(1)对象的状态不受外界影响,promise对象代表⼀个异步操作,有三种状态,pending(进⾏中)、fulfilled(已成功)、rejected(已失败)。只有异步操作的结果,可以决定当前是哪⼀种状态,任何其他操作都⽆法改变这个状态,这也是promise这个名字的由来“承若”;(2)⼀旦状态改变就不会再变,任何时候都可以得到这个结果,promise对象的状态改变,只有两种可能:从pending变为fulfilled,从pending变为rejected。这时就称为resolved(已定型)。如果改变已经发⽣了,你再对promise对象添加回调函数,也会⽴即得到这个结果,这与事件(event)完全不同,事件的特点是:如果你错过了它,再去监听是得不到结果的。
有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供统⼀的接⼝,使得控制异步操作更加容易。
Promise也有⼀些缺点。⾸先,⽆法取消Promise,⼀旦新建它就会⽴即执⾏,⽆法中途取消。其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。第三,当处于pending状态时,⽆法得知⽬前进展到哪⼀个阶段(刚刚开始还是即将完成)。Promise的⽤法
是⼀个构造函数,这个构造函数⾥有两个参数,分别是:resolve(成功之后的回调函数)、reject(失败之后的回调函数)。
因为promise表⽰的是⼀个异步操作,每当我们new⼀个promise实例,就表⽰⼀个具体的异步操作,那么这个异步操作的结果就只能有两种状态:成功/失败,两者都需要回调函数resolve/reject返回。所以内部拿到操作的结果后,⽆法使⽤return把操作结果返回给调⽤者,这时
候只能⽤回调函数的形式来把成功或失败的结果返回给调⽤者。
1var promise = new Promise (function(resolve,reject){
2if(//异步操作成功){
3        resolve(value)
4    } else{
5        reject(error)
6    }
7 }) ;
promise实例⽣成以后,可以⽤then⽅法分别指定resolved状态和rejected状态的回调函数
1 promise.then(
2function(value){
3//success
4    },
5function(error){
6//failure
7    }
8 )
then⽅法可以接受连个回调函数作为参数,第⼀个回调函数是promise对象的状态变为resolved时调⽤,第⼆个回调函数是promise对象的状态变为rejected时调⽤,其中,第⼆个函数是可选的,不⼀定要提供,这两个函数都接受promise对象传出的值作为参数;
*通过。then指定回调函数的时候,成功的回调函数必须传,失败的回调函数可以省略。
如果前⾯的promise执⾏失败,不详影响后续操作终⽌,捕获异常的两种⽅式:
①可以为每个promise指定失败回调;
function(err){
console.log(……)
})
②最后加catch(function(err){
resolved是什么状态console.log(……)
})//表⽰如前⾯有任意⼀个有报错,⽴即报错,并终⽌后⾯的;如果前⾯⽆报错,前⾯正常执⾏。
promise对象实现ajax操作的例⼦
1var getsON = function (url) {
2  var promise = new Pronise( function(resolve,reject ) {
3    var XHR = new XNLHttpRequest();
4    XHR. open("GET" ,url);
5    XHR . onreadystatechange = function ( {
6      if (adystate !-=4) {return; }
7      if(this.status == 200) {
8      sponse);
9      }else{
10      reject(new Error (this.statusText));
11      }
12    };
13    sponseType - "json" ;
14    XHR . setRequestHeader (" Accept" , "application /json" );
15      XHR . send();
16  });
17  return pronise;
18  };
19  get5ON (posts.json" ).then(function(json){
20  console. log("Contents : "+json );
21    }, function(error) {
22  console. log(“出错了",error);
23  });
getJSON是对XMLHTTPRequest对象的封装,⽤于发出⼀个针对JSON数据的HTTP请求,并且返回⼀个promise对象,需要注意的是,在getJSON内部,resolve函数和reject函数调⽤时,都带有参数;
如果调⽤resolve函数和reject函数时带有参数,那么他们的参数会被传递给回调函数,reject函数的参数通常是Error对象的实例,表⽰抛出的错误,resolve函数的参数除了正常的值以外,还可以是另⼀个promise实例;
拓展 async与await
async 函数的返回值为promise对象,promise对象的结果由async函数执⾏的返回值决定
await右侧的表达式⼀般为promise对象, 但也可以是其它的值,如果表达式是promise对象, await返回的是promise成功的值,如果表达式是其它值, 直接将此值作为await的返回值
注意:
await必须写在async函数中, 但async函数中可以没有await,如果await的promise失败了, 就会抛出异常, 需要通过atch来捕获处理

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。