promise对象
Promise是一个构造函数其原型上有then、catch方法,可以用new关键字来创建Promise对象。
promise对象也是用来保存数据的,但是promise对象取出保存的数据是调用then方法,取数据时调用then方法需要给then方法传入参数,传入的参数是回调函数。promise对象内部保存的数据是自己产生的。
promise对象如何产生数据和取出数据
promise对象的参数是传入回调函数。回调函数的参数有2个,这2个参数都是函数。第1个参数的函数调用代表了promise对象内部产生了正确的业务数据。第2个参数的函数调用代表了promise对象内部产生了错误的业务数据。当promise对象内部产生的错误的业务数据没有处理,程序就会抛出这个错误。
当用then方法取数据时,在promise对象第1个参数的调用运行后就触发promise对象内部产生数据。然后调用then方法就会触发then方法传入的回调函数运行,就可以取出产生的数据。无论是否调用promise对象的then方法取数据,promise对象内部都会运行传入promise对象的回调函数来产生业务数据。
then方法传入的第1个参数是回调函数,用来取出promise对象内部产生的正确的业务数据,then方法传入的第2个参数也是回调函数,用来取出promise对象内部产生的错误的业务数据。
promise对象内部不会即产生正确的业务数据又产生错误的数据,当创建promise对象时传入的回调函数的两个参数都调用了就即产生正确的业务数据又产生错误的数据,此时相当于谁先调用就谁先return则即使写了调用第2个参数的回调函数的代码也不会执行这个函数来产生错误的业务数据。所以当用then方法取数据时只会取出产生的正确的业务数据。
在业务中可以通过业务的需求来判断选择需要产生正确或者错误的数据。
let p1=new Promise((n1,n2)=>{
var data={code:27,info:"假设是网络请求后,业务生成的数据"};
if(data.code==404){
n2(data.info);
}else if(data.code==27){
n1(data.info)
};
});
p1.then((data)=>{
console.log(data,111);
}).catch((err)=>{
console.log(err,222);
});
Promise 异步操作有三种状态
Promise 异步操作有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。除了异步操作的结果,任何其他操作都无法改变这个状态。
promise对象的三种状态
Promise 是一个对象,从它可以获取异步操作的消息。
Promise 对象只有:从 pending 变为 fulfilled 和从 pending 变为 rejected 的状态改变。只要处于 fulfilled 和 rejected ,状态就不会再变了即 resolved(已定型)。pending就是promise对象正在产生数据中,fulfilled是产生了正确的业务数据,rejected是产生了错误的业务数据。
通过new关键字创建Promise对象是第1个参数是resolve,第2个参数是reject。
resolve:异步操作执行成功后的回调函数,resolve是将Promise的状态置为fullfiled。
reject:异步操作执行失败后的回调函数,reject是将Promise的状态置为rejected。
promise对象内部的错误的业务数据
promise对象内部的错误的业务数据不仅可以用new关键字创建时调用第2个参数的回调函数来产生还可以抛出错误的业务数据。promise对象可以调用catch方法(就是try-catch语法的封装)来捕获抛出的业务数据。catch方法传入的参数也是一个回调函数。
promise对象内部只要产生了错误的业务数据或者用throw抛出了错误的业务数据就会触发catch方法传入的回调函数的运行。
new Error产生的错误数据是一个对象。
catch方法既可以捕获产生的错误的业务数据也可以捕获用throw抛出的错误的业务数据,then方法第2个参数的回调函数负责处理错误信息也是既可以捕获产生的错误的业务数据也可以捕获用throw抛出的错误的业务数据。产生的错误的业务数据可以不调用promise对象原型的then方法来处理,但是一旦调用了then方法就必须传入then方法的第2个参数的函数来处理产生的错误的业务数据,否则会抛出错误。
then函数的返回值和链式操作用法
then函数的返回值一定是一个promise对象。只有当创建Promise对象内部的两个回调函数中的第1个回调函数调用运行后才会触发then函数内部的回调函数运行。
then的返回值看then传入的参数的回调函数返回值,传入的回调函数的返回值是promise对象那么then的返回值就是这个promise对象,反之就把返回值(无论是基本数据还是引用数据的数组,对象,函数等)创建一个promise对象返回。
var p1=new Promise((n1,n2)=>{
n1(200);
});
var re=p1.then((data)=>{
console.log(data);
return 100;});
//re是一个新的Promise对象,这个新的Promise对象内部的数据是100
console.log(re);
re.then((data)=>{
console.log(data);
});
var p1=new Promise((n1,n2)=>{
n1(200);
});
var re=p1.then((data)=>{
console.log(data);
return new Promise((n1)=>{n1([1,2,3])});});
//re是一个新的Promise对象,这个新的Promise对象内部的数据是数组[1,2,3]
console.log(re);
re.then((data)=>{
console.log(data);
})
这样就可以实现链式操作用法,在链式调用的过程中只要有一个捕获错误的业务数据,把错误业务数据处理了就不会报错。then方法就可以不用传第二个回调函数处理错误信息。意思就是promise对象内部产生的正确业务数据由调用的then方法获取,产生的或抛出的错误数据由catch方法捕获处理。
var p2=new Promise((n1,n2)=>{
n2(527);
});
p2.then((data)=>{
console.log(data,666);
}).catch((err)=>{
console.log(err,777);
});
调用catch方法的不是p2对象,而是p2这个promise对象调用then方法返回的新的promise对象调用的catch方法。当p2这个promise对象内部产生的或者抛出的错误数据在调用then方法没有传入第2个回调函数负责处理错误数据,p2这个promise对象也没有调用catch方法捕获错误数据时,就会把p2这个promise对象内部的错误数据创建一个新的promise对象作为p2这个promise对象调用的then方法的返回值,在用新的promise对象调用catch方法来捕获p2这个promise对象内部产生的或者抛出的错误数据。所以在链式调用的过程中只要有一个捕获错误的业务数据,把错误业务数据处理了就不会报错。
promise对象内部产生的错误数据或抛出错误数据注意点
promise对象内部产生的错误数据必须调用创建promise对象的第2个回调函数来产生。抛出的错误数据必须要用throw关键字抛出。
var p3=new Promise((n1,n2)=>{
var re=new Error("2012");
n1(re);
});
p3.then((data)=>{
console.log(data,666);
}).catch((err)=>{
console.log(err,777);
});
因为创建的这个Error错误对象是调用创建promise对象的第1个回调函数来产生的属于正确的业务数据,所以会触发then方法来取出这个Error错误对象。