直接正题,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对象供下一个方法调用。
文章评论