promise-基础-ajax封装

1.前言

总结前后端交互的几种方式的时候,突然想起来之前小程序用promise封装ajax,简要记录如下
这几天闲来无事又梳理了下 promise


2.常规封装

function getApi(url, data, successCB) {
  wx.showLoading({
    title: '加载中',
  })
  wx.request({
    url: baseUrl + url,
    data,
    header: {
      'content-type': 'application/json' // 默认值
    },
    success: (res) => {
      if (res.code = 200) {
        //   回调到组件 ,数据给他
        successCB && successCB(res.data)
      } else {
        wx.showToast({
          title: '服务器错误',
          icon: 'error',
          duration: 2000
        })
      }
    },
    fail: (err) => {
      wx.showToast({
        title: '服务器错误',
        icon: 'error',
        duration: 2000
      })
      console.log("错误信息:", err);
    },
    complete(res) {
      // console.log("complete",res);
      wx.hideLoading()
      // wx.stopPullDownRefresh()
    }
  })
}

3.promise封装

const getApi = (url, data) => {
  wx.showLoading({
    title: '加载中',
    mask: true
  })
  // Promise 承诺:处理异步回调 同意  拒绝
  return new Promise(function (resolve, reject) {
    // 只能走一个 要么同意 要么拒绝
    // resolve() 回调then()
    // reject() 回调catch() 
    wx.request({
      url: baseUrl + url,
      data,
      header: {
        'content-type': 'application/json' // 默认值
      },
      success: (res) => {
        resolve(res.data)
      },
      fail: () => {
        wx.showToast({
          title: '服务器错误',
          icon: 'error',
          duration: 2000
        })
        reject("服务器错误,请稍后重试");
      },
      complete(res) {
        // console.log("complete",res);
        wx.hideLoading()
        // wx.stopPullDownRefresh()
      }
    })
  })
}

4. 调用

var api = require('../../utils/api');
var shopUrl = ""
var data = {}
api.getApi(shopUrl,data).then(()=>{
 //处理数据
}).catch(()=>{
//异常处理
 wx.showToast({
        title: '服务器错误',
        icon: 'error',
        duration: 2000
      })
})

5. why 为什么需要 promise

诞生背景,解决了哪些问题

  1. js中代码都是单线程 异步执行的.实现异步的方式主要是 回调函数

2.Promise是异步编程的一种解决方案,比传统的解决方案更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象


6. 基础概念

简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。

从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise提供统一的 API,各种异步操作都可以用同样的方法进行处

可以理解为 君子一诺千金,答应的事情,等我这边忙完,一定会给你个答复,不管拒绝还是同意.


7. 核心要点

1.对象的状态不受外界影响。

Promise对象代表一个异步操作,有三种状态:pending(进行中)fulfilled(已成功)rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来

它的英语意思就是“承诺”,表示其他手段无法改变。

2. 一旦状态改变,就不会再变,任何时候都可以得到这个结果。

Promise对象的状态改变,只有两种可能:
pending变为fulfilled
pending变为rejected

只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。

这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的


8. 缺点

1.无法取消Promise,一旦新建它就会立即执行,无法中途取消。
2.如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。
3.当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)


9. 案例

随机数大于4 你赢了 武林盟主
比多久不清楚,所有用定期模拟,间隔时间也是变量

   var test = (resolve, reject) => {
            var randomNum = Math.random() * 10
            console.log("随机是:", randomNum);
            // 比武什么时候结束 是不确定 ,用定时器模拟这个不确定
            setTimeout(() => {
                if (randomNum > 4) {
                    resolve("周润发 赌王 赢了")
                } else {
                    reject("周润发 问鼎赌王 失败")
                }
            }, 1000 * randomNum)
        }

外界并不关心你们这场 比武的过程,只关注结果


10. then 你赢的结果

函数执行成功 告诉Promise对象:执行then
then方法返回的是一个新的Promise实例(注意,不是原来那个Promise实例)。
因此可以采用链式写法,即then方法后面再调用另一个then方法。

  var p1 = new Promise(test)
 var p2 = p1.then(res => {
            console.log("成功:", res);
        })

Promise实例具有then方法,也就是说,then方法是定义在原型对象Promise.prototype上的。

它的作用是为Promise实例添加状态改变时的回调函数。前面说过,then方法的第一个参数是resolved状态的回调函数,第二个参数是rejected状态的回调函数,它们都是可选的。


11. catch 你输的结果

函数执行失败时,我们告诉Promise对象: 执行 catch方法

    var p3 = p2.catch(err=>{
        console.log("失败:",err)
    })

Promise.prototype.catch()方法是.then(null, rejection)或.then(undefined, rejection)的别名,用于指定发生错误时的回调函数


12. finally 不管输赢 都会走

finally()方法用于指定不管Promise对象最后状态如何,都会执行的操作。该方法是 ES2018 引入标准的。

 var p4 = p3.finally(()=>{
   console.log("都会执行")
})

13. 链式写法

  new Promise((resolve, reject) => {
            var randomNum = Math.random() * 10
            console.log("随机是:", randomNum);
            // 比武什么时候结束 是不确定 ,用定时器模拟这个不确定
            setTimeout(() => {
                if (randomNum > 4) {
                    resolve("周润发 赌王 赢了")
                } else {
                    reject("周润发 问鼎赌王 失败")
                }
            }, 1000 * randomNum)
        }).then(res=>{
            console.log("成功:",res);
        }).catch(err=>{
            console.log("失败:",err);
        })

14.原生ajax封装

这里只是简单的例子 ,具体的 请求参数 还需要另做

 <button onclick="sendBtn()">发送</button>
    <script>
        function sendBtn() {
            ajax("GET", "./data.json").then(res => {
                console.log("res:", res)
            }).catch(err => console.log(err))
        }
        // ajax函数将返回Promise对象:
        function ajax(method, url, data) {
            var request = new XMLHttpRequest();
            return new Promise(function (resolve, reject) {
                request.onreadystatechange = function () {
                    if (request.readyState === 4) {
                        if (request.status === 200) {
                         resolve(JSON.parse(request.responseText))
                        } else {
                            reject(request.status);
                        }
                    }
                };
                request.open(method, url);
                request.send(data);
            });
        }
    </script>

15. 总结

Promise最大的好处是:

1.在异步执行的流程中, 把执行代码和处理结果的代码清晰地分离了

  1. 将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数

3.Promise对象提供统一的接口,使得控制异步操作更加容易


参考资料

promise基础
阮一峰-promise
前端请求的5种方式


初心

我所有的文章都只是基于入门,初步的了解;是自己的知识体系梳理;
如果能帮助到有缘人,非常的荣幸,一切都是为了部落的崛起
共勉
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容