• 我转过几个弯 绕过那个小雨楼
  • 拿着蒲扇摆着衣衫渡着紧箍咒
  • 不问天涯不停留 喝过几壶酒
  • 不过年少白头道义放胸口
  • 倘若明天之后 遥看前尘剑封侯
  • 似那天上神仙无所求
  • 朝朝暮暮君如梦醒十分不为何理由
  • 是真是假是惶恐是无休
  • 路过这风雨花满楼 片刻都不停留
  • 我本这书生进京赶考留下许多愁
  • 你问有没有时候 我叹这天道默悠悠
  • 能否与我一醉方休
  • 又过了几个弯 算尽天量道莫慌
  • 踏这田园闻这芳草香
  • 跌跌撞撞仗剑天涯折煞不枉无笔良
  • 是梦是幻是温柔是家乡
  • 路过这风雨花满楼 片刻都不停留
  • 我本这书生进京赶考留下许多愁
  • 你问有没有时候 我叹这天道默悠悠
  • 能否与我一醉方休
  • 路过这风雨花满楼 片刻都不停留
  • 我本这书生进京赶考留下许多愁
  • 你问有没有时候 我叹这天道默悠悠
  • 能否与我一醉方休
  • 谁能与我一醉方休

koa框架1 基础入门之promise

154 0

promise实际是一种格式(封装格式),所有的方法按照promise的要求写,像jq的ajax方法,es6的fetch,axios这些,都是使用了promise标准。

他的原理大概如下

let p = new Promise((resolve, reject) => {
    let xhr = new XMLHttpRequest();

    xhr.open("GET", "xxx/api", true);

    xhr.send();

    xhr.onreadystatechange = function() {
        if (xhr.readyState === 4) {
            if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304) {
                resolve(xhr.responseText);
            } else {
                reject(xhr);
            };
        };
    };

});

p.then(res => {
    //请求成功
    console.log(res);
}, xhr => {
    //请求失败
    console.log(xhr);
});

我们将异步的请求放在promise对象里面,成功就调用resolve方法,传入获取到的参数,失败的话调用reject,将xhr对象传入。

也就是说回调then第一个参数使用的方法就是resolve,第二个为reject。

而且错误的回调promise还有第二种写法,也是我们常见的写法

p.then(res => {
        //请求成功
        console.log(res);
    })
    .catch(xhr => {
        //请求失败
        console.log(xhr);
    });

通过catch捕获错误,这样也行,但是这样意思是所有的错误,都会通过这个catch捕获触发,所有的错误回调使用同一个方法。

而上面那个,是独立的,所以说略有不同,而使用catch也是对应有多个then的时候。

p.then(res => {
        //第一次
        console.log(res);
    })
    .then(res => {
        //第二次
        console.log(res);
    })
    .then(res => {
        //第三次
        console.log(res);
    })
    .then(res => {
        //第四次
        console.log(res);
    })
    .catch(xhr => {
        //请求失败
        console.log(xhr);
    });

如果我们有多个then的时候,错误的方法没必要总是单独写,可以通过通用的一个catch来调用,省事。

all方法

promise还支持多个异步请求,就是说假如有5个异步请求,我需要他们全部都完成才能触发某个操作,那么就可以使用all方法,相反,如果有一个请求出错,就不会触发方法。

代码如下:

Promise.all([
    $.ajax({
        url: "xxx/api",
        dataType: "json"
    }),
    $.ajax({
        url: "xxx/api",
        dataType: "json"
    }),
    $.ajax({
        url: "xxx/api",
        dataType: "json"
    }),
]).then(arr => {
    console.log(arr);
}, xhr => {
    console.log(xhr);
});

all接收一个数组,数组里面存放着异步方法,由于是多个,所有then接收的参数,也会是一个请求返回的内容数组,其内容的数组顺序和请求方法数组顺序相同。

错误则是共用方法。

race

这个和all不同,all是必须所有的请求都要成功,而race则是只要有一个成功了,就结束了。

代码书写和all相同,只是用法不一样。
s
相对来说也用的比较少

Promise.race([]).then(res=>{},xhr=>{})
0
  • 本文分类:Node
  • 本文标签:promise
  • 流行热度:已超过 154 人围观了本文
  • 最后更新:2020年08月12日 - 0时08分18秒
  • 发布日期:2020年08月12日 - 0时08分18秒
  • 版权申明:本文系作者@木灵鱼儿原创发布在木灵鱼儿 - 有梦就能远航站点。未经许可,禁止转载。
微信收款码
微信收款码