浅析promise

1.promise是什么

运用场景:当你需要向后台请求三个字符串,将三个字符串请求结果拼接在一起时

var result =Promise.all([ajax1,ajax2,ajax3]).then(()=>{
   //TODO
})

Promise是异步编程的一种解决方案

特点:①异步操作:有三种状态:pending(进行中)、fulfilled(已成功)、reject(已失败)。只有异步操作的结果可以改变这三种状态。

②状态一旦改变就不会再次改变,并且再次调用时会立即获取结果。

缺点:①一旦新建promise就会立即执行,无法中途停止,then指定的回调函数在本页面的同步函数之后执行

②当处于pending状态时,无法获知进行到那一阶段

③不设置回调函数,promise内部抛出的错误不会反映到外部

2、基本用法

var drink = true;
const promise = new Promise((resolve,reject)=>{
    if(drink) return resolve(drink);
    else return reject(new Error('err'));
})

promise.then(val => console.log(val))
.catch(err => console.log(err));

promise构造函数接受一个函数为参数,实例创建后使用then方法指定成功与失败函数;不过,失败函数一般使用catch捕获

案例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Promise</title>
</head>
<body>
    <div class=main ></div>
    <script>

    let url = 'https://b-gold-cdn.xitu.io/v3/static/img/logo.a7995ad.svg';

    let loadImg = loadImgAsync(url)
    loadImg.then((img)=>{
        let div = document.querySelector('.main');
        div.appendChild(img);
        console.log('success');
    });



    function loadImgAsync(url){
        let promise = new Promise((resolve,reject) =>{
            var img = new Image();
            img.onload = resolve(img);
            img.onerror = reject(new Error('Could not load image at ' + url));
            img.src = url;
        });
        return promise;
    }

    </script>
</body>
</html>

promise.resolve()与promise.reject()都相当创建一个promise对象,并执行对应的回调函数

3、promise.all()

Promise.all 方法用于将多个 Promise 实例包装成一个新的 Promise 实例

var promise = new Promise([p1,p2,p3]);

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Promise</title>
</head>
<body>
    <div class=main ></div>
    <script>

    let img1 = loadImgAsync('http://img.zcool.cn/community/01b34f58eee017a8012049efcfaf50.jpg@1280w_1l_2o_100sh.jpg');
    let img2 = loadImgAsync('http://img.zcool.cn/community/0117e2571b8b246ac72538120dd8a4.jpg@1280w_1l_2o_100sh.jpg');
    let img3 = loadImgAsync('http://img07.tooopen.com/images/20170316/tooopen_sy_201956178977.jpg');

    let imgPromise = Promise.all([img1,img2,img3]);

    imgPromise.then((imgArr) => {
        let main = document.querySelector('.main');
        console.log(imgArr);
        let fragment = document.createDocumentFragment();
        imgArr.forEach(ele => {
            fragment.append(ele);
        });
        main.append(fragment);
    }).catch( err => console.log(err) );

    function loadImgAsync(url){
        let promise = new Promise((resolve,reject) =>{
            var img = new Image();
            img.src = url;
            img.onload = resolve(img);
            img.onerror = reject(new Error('Could not load image at ' + url));
        });
        return promise;
    }

    </script>
</body>
</html>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值