直接正题,ES6的Promise解决了困扰人们很久的回调问题,回调函数在编码中用的很多,但是多层嵌套的回调会让代码看起来不是很整洁,也影响阅读,Promise旨在解决这个问题,用同步的写法解决异步的问题。
解决了用同步的写法解决异步的问题
没有使用promise的多层回调:
function fn() {
function fn1() {
function fn3() {
function fn4() {
...
}
}
}
}
不直观,维护起来也比较麻烦。
promise的使用:
直接可以使用new Promise()来创建一个promise对象,其参数是一个包含resolve,reject两个参数的function,并在该函数中调用执行者两个参数。该函数里面会执行resolve()方法,表示异步调用成功时执行,reject()表示异步调用失败时候调用。
在链式调用时候,then后面接的第一个函数为成功时调用的函数—resolve,并且这里的默认参数等同于promise中resolve中的初始参数;then里面的第二个函数,为异步调用失败之时执行。
catch方法,相当于then(null,function(data){console.log(data)}失败方法调用的一个缩写。
var p = new Promise(function(resolve,reject){
if(data){
resolve('success');
}else{
reject('filed');
}
})
p.then(function(data){
console.log(data);//success
},function(data){
console.log(data);//filed
}).catch(data){
console.log(data);//filed
}
Promise.all
Promise.all 可以接收一个元素为 Promise 对象的数组作为参数,当这个数组里面所有的 Promise 对象都变为 resolve 时,该方法才会返回。
var p1 = new Promise(function (resolve,reject) {
if(true){
resolve('success1')
}else{
reject('filed1')
}
})
var p2 = new Promise(function (resolve,reject) {
if(true){
resolve('success2')
}else{
reject('filed2')
}
})
Promise.all([p1, p2]).then(function (result) {
console.log(result); // [ 'success1', 'success2' ]
});
promise 的then方法可以链式调用是因为每一个then完成之后都会返回一个新的Promise对象供下一个方法调用。
文章评论