您的位置:首页 > 其它

ES6中的异步对象Promise

2018-03-20 21:54 459 查看
回忆一下ES5中的怎么使用异步方法
// es5中的异步回调
let ajax = function(callback){
console.log('执行') // 执行
setTimeout(() => {
callback&&callback.call();
}, 1000)
};

ajax(function(){
console.log('hello') // 1s后打印hello
});

使用ES6的Promise的方法:
let ajax = function(){
console.log('执行2'); // 执行2
return new Promise((resolve,reject)=>{
setTimeout(() => {
resolve() // 执行下一步操作, reject // 中断当前的操作
},5000)
})
}

ajax().then(()=>{
console.log('promise','timeout2') // 5s后打印 promise timeout2
})

连续使用Promise对象:
let ajax = function(){
console.log('执行3');
return new Promise((resolve,reject)=>{
setTimeout(() => {
resolve();
},5000)
})
}

ajax().then(function(){
return new Promise(function(resolve,reject){
setTimeout(() => {
resolve()
}, 2000)
})
}).then(function(){
console.log('timeouk3') // 7s后打印timeouk3
})

Promise捕获错误的catch( )
 // catch 捕获错误
    let ajax = function(num){
      console.log('执行4');
      return new Promise(function(resolve,reject){
        if(num>=5){
          resolve();
        }else{
          throw new Error('传入的数字比5小')
        }
      })
    }

    ajax(4).then(function(){
      console.log('log',4);
    }).catch(function(err){
      console.log('catch',err); // catch Error: 传入的数字比5小
    })

Promise的两种高级用法
1.Promise.all( )
function loadImg(src){
return new Promise((resolve,reject)=>{
let img = document.createElement('img');
img.src = src;
img.onload = function(){
resolve(img);
}
img.onerror = function(err){
reject(err);
}
})
}

// 对所有的图片进行遍历
function showImgs(imgs){
console.log(imgs);
imgs.forEach(function(img){
document.body.appendChild(img);
})
}

// promise.all()的用法
Promise.all([
loadImg('http://yanshi.sucaihuo.com/modals/0/23/small.jpg'),
loadImg('http://yanshi.sucaihuo.com/modals/0/20/small.jpg'),
loadImg('http://yanshi.sucaihuo.com/modals/0/2/small.jpg')
]).then(showImgs)

/**解析:
把多个promise实例当做一个promise实例,当所有的promise实例发生变化后
新的promise实例才会发生变化
*/

2.Promise.race( )
// Promise 先加载 有一个图片加载完就先添加到页面
function loadImg(src){
return new Promise((resolve,reject)=>{
let img = document.createElement('img');
img.src = src;
img.onload = function(){
resolve(img);
}
img.onerror = function(err){
reject(err);
}
})
}

function showImgs(img){
let p = document.createElement('p');
4000
p.appendChild(img);
document.body.appendChild(p);
}

// promise.race()的用法 只要有一个网速好的加载完,其他的就不加载了
Promise.race([
loadImg('http://yanshi.sucaihuo.com/modals/0/23/small.jpg'),
loadImg('http://yanshi.sucaihuo.com/modals/0/20/small.jpg'),
loadImg('http://yanshi.sucaihuo.com/modals/0/2/small.jpg')
]).then(showImgs)
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: