Vue解决vue-resources异步请求问题

image.png

项目中,这里默认选中优惠券类型的函数,我写在mounted中,但是mounted直接执行话,会因为获取不到ajax请求到的数据,从而判断失败而执行失败;

最开始写法:

defaultSelection()函数需要self.couponId、self.haveReduction、self.haveBalance等参数,但是这些参数都是ajax异步请求之后才获得的,但是此时mounted在ajax还未请求成功渲染完数据的时候,就已经执行结束了,所以导致函数判断失败;
这里,最开始的解决思路有两种:
一、是把请求改为同步,但是这里存在几个问题,1是vue-resources我不知道怎么设置为同步请求,2是这样会造成页面在绑定数据时产生阻塞和卡顿,因此这不是最好的解决方法;
二、在mounted函数设置一个时间定时,大概给个执行时间,延后其执行,但是这样的结果是,如果有时候网络不流畅,数据请求慢,mounted这时已经执行完了,所以也会导致函数执行错误;
三、是我后面选择的解决方法,通过数据请求回掉成功之后,设置一个变量,然后通过watch钩子判断这个变量有没有发生变化,如果检测到发生变化了,这样就执行函数,这样就不会报错了;

最开始代码:
mounted:{
//    默认选中优惠(优先级:满减、优惠券、收益金、基金)
  /*      setTimeout(function(){
            self.defaultSelection();
        },200)*/
}
      defaultSelection:function () {
          var self = this;
          if(window.sessionStorage.jumpCouponFlag == "hadIn" && checkAddr.selectDiscount != undefined){
            console.log("默认选择优惠券传过来的优惠券");
              this.coupon.selectFlag = true;
              var oldPrice = checkAddr.orderTotal;
              var discountPrice = checkAddr.selectDiscount;
              console.log(discountPrice);
              if (this.coupon.selectFlag) {
//          优惠券
                  this.coupon.src = iconed;
                  if (discountPrice != undefined) {
                      var couponObj={};
                      this.total.price = parseFloat(oldPrice) - parseFloat(discountPrice);
                      couponObj['name']='优惠券抵扣';
                      couponObj['price']=discountPrice;
                      if(this.details.length>2){//目前需求就只能选择一种优惠
                          this.details.pop();
                          this.details.push(couponObj);
                      }else{
                          this.details.push(couponObj);
                      }
                  }
              }
          }else if(self.haveReduction){
              this.reduction.selectFlag = true;
              window.checkAddr = window.localStorage;
              var oldPrice = checkAddr.orderTotal;
              var reductionObj={};
              reductionObj['name']='满减抵扣';
              if (this.reduction.selectFlag) {
                  this.reduction.src = iconed;
                  var nowPrice = parseFloat(oldPrice) - parseFloat(this.reduction.cutPrice);
                  this.total.price = parseFloat(nowPrice);
                  reductionObj['price']=this.reduction.cutPrice;//抵扣金额>实际金额
                  if(this.details.length>2){
                      this.details.pop();
                      this.details.push(reductionObj);
                  }else{
                      this.details.push(reductionObj);
                  }
              }
          }else if(self.couponId != ''){
              this.coupon.selectFlag = true;
              var discountPrice = self.couponPrice;
              var oldPrice = checkAddr.orderTotal;
              if (discountPrice != 0) {
//          优惠券
                  this.coupon.src = iconed;
                  if (discountPrice != undefined) {
                      var couponObj={};
                      this.total.price = parseFloat(oldPrice) - parseFloat(discountPrice);
                      couponObj['name']='优惠券抵扣';
                      couponObj['price']=discountPrice;
                      if(this.details.length>2){//目前需求就只能选择一种优惠
                          this.details.pop();
                          this.details.push(couponObj);
                      }else{
                          this.details.push(couponObj);
                      }

                  } else {//不存在就是原来的价钱
                      this.total.price = parseFloat(oldPrice);
                  };
              }
          }else if(self.haveBalance){
              this.actives.selectFlag = true;
              var oldPrice = checkAddr.orderTotal;
              if (this.actives.selectFlag) {
                  this.actives.src = iconed;
                  var balanceObj={};
                  balanceObj['name']='收益抵扣';
                  var nowPrice = parseFloat(oldPrice) - parseFloat(this.actives.content);
                  if (parseFloat(nowPrice) < 0) {
                      this.total.price = 0;
                      balanceObj['price']=oldPrice;//抵扣金额>实际金额
                      self.fundBalanceOver = 3;   //如果完全抵扣,generate接口支付方式payType需要传参2
                  } else {
                      this.total.price = parseFloat(nowPrice).toFixed(2); //四舍五入处理,因为
                      balanceObj['price']=this.actives.content;//抵扣金额<实际金额
                  };
                  if(this.details.length>2){
                      this.details.pop();
                      this.details.push(balanceObj);

                  }else{
                      this.details.push(balanceObj);
                  }

              }
          }else if(self.haveFund){
              this.fund.selectFlag = true;
              var oldPrice = checkAddr.orderTotal;
              if (this.fund.selectFlag) {
                  this.fund.src = iconed;
                  var fundObj ={};
                  fundObj ['name']='基金抵扣';
                  var nowPrice = parseFloat(oldPrice) - parseFloat(this.fund.content);
                  if (parseFloat(nowPrice) < 0) {
                      this.total.price = 0;
                      fundObj ['price']=oldPrice;//抵扣金额>实际金额
                      self.fundBalanceOver = 2;   //如果完全抵扣,generate接口支付方式payType需要传参2
                  } else {
                      this.total.price = parseFloat(nowPrice).toFixed(2); //四舍五入处理,因为
                      fundObj ['price']='-'+this.fund.content;//抵扣金额<实际金额
                  };
                  if(this.details.length>2){
                      this.details.pop();
                      this.details.push(fundObj );

                  }else{
                      this.details.push(fundObj );
                  }

              }
          }
      }
修改后代码:
watch:{
          defaultSelectFlag: 'changeDefaultSelect'  //这里设置了一个变量defaultSelectFlag
      }
    changeDefaultSelect:function(newVal,oldVal){
            console.log("改变了,请求默认选中函数");
            var self = this;
            self.defaultSelection();  //检测到数据加载完了,就执行此函数(代码内容同上)
      },
      getCouponFlag: function () {//优惠券是否可用
        var self = this;
        var buyProds = [];
        for (var i = 0; i < self.prods.length; i++) {
          var buyObj = {}
          buyObj["detailId"] = self.prods[i].detailId;
          buyObj["buyNum"] = self.prods[i].amount;
          buyProds.push(buyObj);
        };
        console.log(window.JSON.stringify(buyProds));
        self.turnbuyPros = buyProds;
        console.log(window.JSON.stringify(self.turnbuyPros));
        self.$http({
          method: 'get',
          url: '/mall/coupons/pay',
          params: {'prods': window.JSON.stringify(buyProds)},
          emulateJSON: true
        }).then(function (data) {
          var obj = data.data;
          if (obj.status == 1) {
            var coupons = obj.arrayresult;
            var arrCanUse = [];
            for (var i = 0; i < coupons.length; i++) {
              if (coupons[i].status == 1) {
                arrCanUse.push(coupons[i]);
              }
            };
            //从优惠券页面选中优惠券后的显示
              if (arrCanUse.length > 0) {

            //        self.coupon.couponFlag = '可使用';
                      self.couponId = coupons[0].couponid;
                      self.couponPrice = coupons[0].discount;
                      console.log("优惠券");
                      console.log(self.couponPrice);
                      console.log(self.couponId);
                  if(checkAddr.selectDiscount == undefined){
                      self.appearDiscount = true;
                      self.coupon.couponFlag = '¥' + self.couponPrice;
                  }
//
              } else {
                self.coupon.couponFlag = '不可用';
              }
              self.defaultSelectFlag = true;    //          >>>>>数据加载成功,将此变量修改
          } else {
//            alert(obj.errmsg);
          }
        }, function (error) {
//          window.location.href="http://www.maojimall.com/maojimall/netFail.html";
        });
      },
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 1.几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构? 基本数据类型:Undefined、Nul...
    极乐君阅读 5,492评论 0 106
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,384评论 25 707
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,278评论 0 6
  • 每个人都会有自己的想法,无论是否会把这些表现于言语或者是展现于行。他们的心里是知道的,有的人能够追寻自己的...
    浮生梦醒阅读 209评论 1 0