promise是es6中增加的新内容
它就是一个对象,主要用来处理异步数据的
为了我们的代码更加具有可读性和可维护性,我们需要将数据请求与数据处理明确的区分开来,这时候,就显示出了promise的重要。
在promise中,有三种状态
——》resolve(完成)
pending (等待,处理中) ———
——》rejected(失败,拒绝)
状态只能从pending 到 resolve 或者 pending 到rejected 并且不可逆
用法:
var pro = new Promise(function(resolve,reject){
resolve("成功"); // 成功,就传递数据 “成功”出去
reject("失败"); // 失败,就传递数据“失败”出去
})
pro.then(function(val){},function(err){})
第一个是成功的回调函数,val接收resolve()中的数据
第二个是失败的回调函数,err接收reject()中的数据
then()方法执行完成之后又返回的是一个promise对象,所以可以继续在后面接 .then()方法,并且可以使用链式结构的写法。比如:
pro.then(function(val){},function(err){}).then(function(val){},function(err){})
catch 捕获的用法
用来制定reject的回调,并且发生错误可以继续执行代码不使代码停在错误的地方。
用法如下:
var p = new Promise(function(resolve,reject){ resolve("success"); }) p.then(function(data){ console.log(data); //success throw "发生错误了" }).catch(function(err){ console.log(err); //发生错误了 })
all 的用法
只有当所有的promise全部成功才能走成功,否则失败
用法如下:
var p1 = Promise.resolve(10); var p2 = Promise.resolve(20); var p3 = Promise.reject(30); Promise.all([p1,p2,p3,true,false]).then(function(data){ console.log(data); },function(err){ console.log(err); //30 })
如果没有错误:
var p1 = Promise.resolve(10); var p2 = Promise.resolve(20); Promise.all([p1,p2,true,false]).then(function(data){ console.log(data); //[10,20,true,false] },function(err){ console.log(err); })
race 用法
race也是返回一个promise对象
作用是获取最先得到的结果
var p1 = new Promise(function(resolve,reject){ setTimeout(resolve,100,"first"); }) var p2 = new Promise(function(resolve,reject){ setTimeout(resolve,50,"second"); }) Promise.race([p1,p2]).then(function(val){ console.log(val) //second })
成功的promise里面可以传递一个成功的promise对象
var p1 = Promise.resolve(10); var p2 = Promise.resolve(p1); p2.then(function(data){ console.log(data); // 10 })