用户
 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,登录网站

2017-3-27 17:07:25 天下雪原创达人 造轮子 人生巅峰 楼主 06280
官方说明:
request 的最大并发数是 5
upload/download最大并发限制是 5 个

说明:不是一个项目5个请求,是一个页面同时请求不能超过5

官方问答:下载接口调用失败,不能超过最大连接数5
一个文件上传完成后,开始下载一个文件,下载文件失败,报错errMsg: "downloadFile:fail exceed max download connection count 5",微信这个下载接口是多线程的么?我就一个文件下载,为什么超过最大并发数,而且文档上写的最大并发数不是10么?
  • 文档上写的的确是10,但是实际上只允许5个。这里我们会尽快修改过来的
  • 下载操作是并发执行的,不会阻塞当前 webView。
  • 在调用下载接口的时候,会做一个 +1 的计数操作,当请求完成之后才会减去对应的计数。
  • 综上,有可能是你的代码请求后台的时候同时发起了多次请求,超过了最大限制;或者是和后台连接在下载完成的时候没有释放。


相关文章:
小程序开发的一些经验
  • 使用 Promise,让你的异步并发和串行代码更容易编写和维护。因为微信旧版是没有原生 Promise 的,所以官方屏蔽了 Promise,你需要自己做一个 Promise 实现,网上有兼容标注 Promise 规范的实现,只需去掉相关 window 的判定即可:https://gist.github.com/chemzqm/8e50e23c35cc14992831027a40b8d871
  • 分离 UI 代码和请求逻辑,这样你的请求可以在不同页面重用,将来维护相对容易些。我们有一个 service.js 文件,里面包含了所有请求后台的函数,返回均为 Promise, 这样方便做统一的控制管理
  • 并发请求限制,小程序限制了最多 5 个并发的 request 请求。我们遇到的一个情况是需要图片自适应高度,而小程序不支持图片高度自适应,需要显示用 wx.getImageInfo 接口获取图片尺寸信息,如果图片多于 5 个且同时请求就会触发这个限制。解决办法是使用一个 promise 队列函数,实现如下:





    [AppleScript] 纯文本查看 复制代码
    export function queue (fns, count) {
      return new Promise(function(resolve, reject) {
        let a = fns.slice(0, count)
        let b = fns.slice(count)
        let l = fns.length
        let runs = 0
        if (fns.length == 0 ) return resolve()
        for (let fn of a) {
          fn().then(() => {
            runs += 1
            if (runs == l) return resolve()
            let next = function () {
              let fn = b.shift()
              if (!fn) return
              return fn().then(() => {
                runs += 1
                if (runs == l) return resolve()
                return next()
              }, reject)
            }
            return next()
          }, reject)
        }
      })
    }

    第一个参数为返回 promise 的函数列表,第二个参数为并发个数,函数返回 Promise 对象。

onLaunch异步回调数据无法加载问题
关于小程序的限制,是时候优化一下你的项目了
干货!小程序开发,你应该知道的那些事儿:项目工程化与突破最大并发数5 ..

promise相关:

  • 问题原因:TypeError: Cannot read property 'Promise' of undefined
  • 解决方案:微信开发工具更新后不支持Promise对象,需要引入第三方库来支持Promise

微信小程序小总结:解析xml问题,解析html问题,兼容Promise和Generator
扩展微信小程序框架功能:Promise
dzp:微信小程序 es6 promise
微信小程序中使用Promise进行异步流程处理
微信小程序使用Promise实践
微信小程序学习用完整demo:对wx接口的promise封装
wx-promise脚手架:基于 es6-promise 对小程序现有 wx-api 进行封装
微信小程序 API Promise 化.
微信小程序填坑-Android真机环境下的bluebird.js
微信小程序模板,集成redux,并且提供了方便快捷的开发环境
微信小程序学习用demo:电商模板,全静态页面
微信小程序SDK封装:API,login,promise,


async/await相关:
微信小程序中使用co来处理异步流程
微信小程序中异步处理终极方案async/await
终于可以愉快的使用 async/await 啦

相关讨论:
小程序并发请求数不超过5,自选股使用动态接口将页面需要的数据进行合并,通过一个接口获取页面所需数据。

相关讨论:
请教各位大神 wx.request 多并发,怎样处理 ?
wx.request并没有多并发这么一说
如果你要多个求,就写多个wx.request,我最高用了三条;
我给你说一下思路,api结构非常重要,
比如,系统信息,位置呀,拉取入库用户,经验不足的程序,可能请求三次,但是这里只需要一次

怎么修改?
调用,函数之间一层套一层,不套也可以,存在本地或者变量,然后一并请求;写回调也可以。

相关讨论:
这个最大并发数是什么意思?一次同时发送?
类似于cpu5核的意思,5核你知道是什么意思吗?在给你打个比方。
你2只手。只能同时做两件事。现在给你5只手。这样更形象了吧

可是我是发送完第一个,获取数据后再操作第二个,这样不会并发吧
如果你是获取后再进行第二个。这不算并发

我需要先获取用户的unionid才能让用户用我们的小程序,但是 我把获取unionid 的请求放在 onload里,unionid还没得到,onshow里的已经执行了,这个该怎么办?
如果你没等获取就第二个。那就叫并发。并发超过5时 其他的就得排队。

恩,我是在第一个返回的success里操作第二个 request 的,不算并发的,但是不明白为什么进不去
使用promise,或者把onShow的执行放入请求id成功的回调函数里。
onShow中的处理全部封装在一个方法里,  然后load请求成功后,调用这个方法

新增案例:scroll-view 下拉事件被请求两次
page.wxml
[AppleScript] 纯文本查看 复制代码
<import src="../../common/template/template.wxml"/>

<block wx:if="{{ specials && !error }}">
<view class="page-product">
<scroll-view class="product-list" scroll-y="true" enable-back-to-top="true" bindscrolltolower="scrollLower" bindscroll="scroll" scroll-top="{{ scrollTop }}">
<template is="product-list" data="{{ products: specials }}"/>

<template is="loading" data="{{ hasMore: hasMore }}"/>
</scroll-view>
</view>
</block>

<block wx:else>

<template is="error" data="{{ errMsg: error }}"/>
</block>
page.js
[AppleScript] 纯文本查看 复制代码
var app = getApp();

Page({
  data:{
    page: 1,
    scrollTop: 0,
    hasMore: true,
    specials: [],
    error: null
  },
  onLoad:function(options){
        this.getSpecial()
        console.log(1);
  },
  scrollLower: function() {
        this.getSpecial()
        console.log(2);
  },
  scroll: function(e) {
        let sTop = e.detail.scrollTop;
        this.setData({
            scrollTop: sTop
        });
  }
  getSpecial: function() {
        let page = this.data.page
        let rows = this.data.specials
        if(page == 0) {
            return
        }
        app.common.request('product/discount',{ page: page, size: 20},(ret) => {
            if(ret.err_no == 0) {

                for(var x in ret.results.rows) {

                    rows.push(ret.results.rows[x]);
                }

               let nextPage = (ret.results.next == page ? 0 : ret.results.next);

               this.setData({
                  page: nextPage,
                  hasMore: (nextPage == 0 ? false : true),
                  specials: rows
               });

            } else {

                this.setData({
                    error: ret.err_msg
                })
            }
        })
    },
})
下拉一次上面的 scrollLower() 会执行多次
page.json
[AppleScript] 纯文本查看 复制代码
{
    "navigationBarTitleText": "集市",
    "enablePullDownRefresh": false
}
template.wxml
[AppleScript] 纯文本查看 复制代码
<template name="product-list">
<view class="list-item" wx:for="{{ products }}" wx:for-item="item" wx:key="{{ item.id }}">
    <navigator url="/pages/product/detail?id={{ item.id }}" open-type="navigate">
    <image class="list-item__image" src="{{ item.thumb }}" mode="aspectFill"></image>
    <view class="list-item__desc">
        <text class="list-item__title">{{ item.name }}</text>
        <text class="list-item__cate">{{ item.category }}</text>
        <text class="list-item__price">{{ item.price == 0 ? '议价' : ' ¥ ' + ( item.price_discount == 0 ? item.price : item.price_discount ) }}</text>
    </view>
    </navigator>
</view>
</template>


<template name="loading">
<view class="loading">
<block wx:if="{{ hasMore }}">
    <view class="loading-image">
        <text>拼命加载中...</text>
    </view>
</block>
<block wx:else>
    <view class="loading-text">
        <text>我是底线</text>
    </view>
</block>
</view>
</template>

<template name="error">
<view class="error">
<icon type="warn" size="120" color="#ccc"></icon>
<text>{{ errMsg }}</text>
</view>

</template>
下拉的时候 会抖动,scrollLower() 会被请求多吃

答:_JustCk
设置一个开关变量,例如:isFreshing,默认设置isFreshing: false,在调用获取数据的接口时判断isFreshing是否为true,是的话就return就好了,不是的话,就执行请求,然后再设置为true,获取到数据之后,再设置为false

有问题请在本站内搜索相应关键词,假如无法解决请在综合交流区内发帖咨询,发帖时请提供详细的问题描述、相关图片及代码。
发新帖
您需要登录后才可以回帖 登录 | 立即注册