概述:
1.Promise是es6提供的一个构造函数(关键字),同步函数,也是一个数据容器(自己产生数据);
2.使用方法:new Promise(),注意首写字母一定要大写;
3.取出promise数据容器,用then函数
4.then函数是一个异步非阻塞函数
promise对象有以下两个特点:
1.对象的状态不受外界影响。promise对象带编一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)、rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其它操作都无法改变这个状态。
2.一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。
补充:
-
数据容器:map set arr object被动产生数据,给它添加数据
-
new Error():是正确的业务对象,但它是js中的err类型的对象
使用方法:
var p1=new Promise(
function(resolve,reject){//n1、n2只能调用一个
if(条件){
resolve()//代表触发,让promise对象内部产生正确的数据,p1.then()就为:p1.then(function f1(){})
}else if(条件){
reject()//代表触发,告知promise体系 产生了数据,但是是reject触发,说明是业务错误的数据,p1.then()就为:p1.then(function f2(){})
}
});
p1.then(function f1(data){},function f2(err){})
代码解释:
-
p1.then()的返回值是一个新的Promise对象,then函数是一个异步非阻塞函数
-
p1数据容器取数据用then函数。
-
data是p1产生的数据,并不是n1()传入的值
-
function f1(data){}:取出正确的数据
-
reject() 可以用 throw “错误” 代替
-
抓取错误,处理错误:
1.function f2(err){} 2.catch方法(promise对象可以调用,可以连调)
n1和n2是官方定义的函数,与then()里的function无关。
注意:then传入的回调函数的返回值是:
1.如果是一个promise对象,那么就是它;
2.如果不是一个promise对象,那么就会把函数的结果包装为一个生成数据了的promise对象
理解代码: