CMS小程序里request貌似没有考虑异步操作问题。红包求改善。

发布于 2018-08-22

CMS里带的小程序代码里 request方法可能是没有考虑异步操作问题,会导致一些异常。

求比如经过promise改善过的request方法代码。完美代码有红包。。。聊表心意

就是app.js里的:

`

//发起网络请求

  request: function(url, data, success, error) {
        var that = this;
        if (typeof data == 'function') {
              success = data;
              error = success;
              data = {};
        }
        if (this.globalData.userInfo) {
              data['user_id'] = this.globalData.userInfo.id;
              data['token'] = this.globalData.userInfo.token;
        }
        //移除最前的/
        while (url.charAt(0) === '/')
              url = url.slice(1);
        this.loading(true);
        wx.request({
              url: this.apiUrl + url,
              data: data,
              method: 'post',
              header: {
                    "Content-Type": "application/x-www-form-urlencoded"
              },
              success: function(res) {
                    that.loading(false);
                    var code, msg, json;
                    if (res.statusCode === 200) {
                          json = res.data;
                          if (json.code === 1) {
                                typeof success === 'function' && success(json.data, json);
                          } else {
                                typeof error === 'function' && error(json.data, json);
                          }
                    } else {
                          json = typeof res.data === 'object' ? res.data : {
                                code: 0,
                                msg: '发生一个未知错误',
                                data: null
                          };
                          typeof error === 'function' && error(json.data, json);
                    }
              },
              fail: function(res) {
                    that.loading(false);
                    console.log("fail:", res);
                    typeof error === 'function' && error(null, {
                          code: 0,
                          msg: '',
                          data: null
                    });
              }
        });
  },

查看更多

关注者
0
被浏览
625
君君要上天
君君要上天 2018-08-23
这家伙很懒,什么也没写!

这根本不是问题,是你不会用。image.png
此处success传一个function进去,在function里面执行代码就会在请求完成之后执行。。我怀疑你连ajax都不知道。

13 个回答
君君要上天
君君要上天 2018-08-22
这家伙很懒,什么也没写!

导致什么异常?

woo2000
woo2000 2018-08-22
这家伙很懒,什么也没写!

比如,文字或图片信息还没获取到,就去渲染页面了。再或者,还没取回该用户是否发布过信息,就去显示该用户发布信息的条数了。

君君要上天
君君要上天 2018-08-22
这家伙很懒,什么也没写!

这简单啊。在请求之前先把页面隐藏起来,请求成功之后渲染页面并且把页面显示出来不就好了。

woo2000
woo2000 2018-08-22
这家伙很懒,什么也没写!

如何在请求成功之前“隐藏”页面? 也就是如何阻止代码往下执行?
这个还不光是显示的问题,很多逻辑判断,都遇到了问题。比如如果用户发布过信息,就修改(edit),没发布过,就发布(add)。那先要判断是否发布过,是否发布过这个请求还没返回结果,代码就往下执行去判断发布还是修改,但是此时判断依据还没产生呢。(后端远程服务器比较慢的情况)

君君要上天
君君要上天 2018-08-22
这家伙很懒,什么也没写!

request请求有成功和失败回调啊,你把代码逻辑放在回调里执行不就可以了。

woo2000
woo2000 2018-08-23
这家伙很懒,什么也没写!

我也不是很懂,就是发现,request请求还没任何结果的时候,代码就往下执行了。百度了一下,确实有这类问题。通常是用promise解决,但是我不懂程序语法,以前在thinkCMF上弄过,不过在fasradmin的代码风格里,照葫芦画瓢卡住了。

woo2000
woo2000 2018-08-23
这家伙很懒,什么也没写!

那我也不能把后面所有的代码都写在success里吧?

我不是程序员,思维也不属于理性的,不习惯抽象的东西,比如面向对象的编程就不行。ajax10年前接触过,不过也是抄代码,修改。我现在也是这样。10年前的东西,我现在也还是不会。只会分析,修改。

F4NNIU
F4NNIU 认证专家 2018-08-23
我知道的一定回复,如果觉得我的回答还不错,欢迎给我点赞。

你这是给自己的思想加了一个上限。:grin:

F4NNIU
F4NNIU 认证专家 2018-08-23
我知道的一定回复,如果觉得我的回答还不错,欢迎给我点赞。

大神总是那么谦虚的。

woo2000
woo2000 2018-08-24
这家伙很懒,什么也没写!

意思是,,,,真的可以把以后所有的东西,都写在success里? 再后面的代码写在后来的request里的success里?如此嵌套?

woo2000
woo2000 2018-08-24
这家伙很懒,什么也没写!

1535073135431.jpg

woo2000
woo2000 2018-08-24
这家伙很懒,什么也没写!

在你和F4NNIU 的教导下,有点想通了。虽然这样有嵌套的麻烦,但是实际上又能嵌套几层呢。也就2-3层,还是可以解决眼前问题的。

谢谢了哈。。。。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览