qq小游戏发布的踩坑日记(一)

资源请求

这阵子要发布qq小游戏了 , 没想到刚上来就翻车了...直接请求资源的时候就炸了:

报错如下:

image.png

VM696:263 createDownloadTask:fail exceed max download connection count

查了下文档 , 说是一次请求不能超过10个...(资源超过10M的一般都超过10个吧??);

各种找, 最后还是得去微信小程序社区找方案, 兜兜转转又跑去github弄了个轮子,

简而言之就是做个队列, 反正每次请求不能超过10个,超过了就老实呆着排队,等一下再说:

最大并发限制10个

并发限制文档传送门

先上github上面轮子的链接:

wx-queue 轮子传送门

嗯...这个轮子有点古老,不能直接用, 而且是用在微信小程序上面的, 所以我得改造一下,废话少说上代码:

//index.js
  import q from './queue'

  function queueRequest(request, concurrency = 10) {

    if (typeof request !== 'function') {

        throw Error('request must be function')

    }

    const queue = q((task, callback) => task(callback), concurrency)

    return (obj) => {

        queue.push((callback) => {

            const originComplete = obj.complete

            obj.complete = (...args) => {

                callback()

                if (typeof originComplete === 'function') {

                    originComplete(...args)

                }

            }

            request(obj)

        })

    }

}
//在老轮子的基础上,在这里加了点东西,因为是downloadFile不给力...qq小游戏的api跟微信部分的是通用的,你懂的,顺手一起弄上去了
  function queue(concurrency) {

    const request = wx.request

    Object.defineProperty(wx, 'request', {

        get() {

            return queueRequest(request, concurrency)

        }

      })

    const QQrequest =qq.request;

    Object.defineProperty(qq, 'request', {

        get() {

            return queueRequest(QQrequest, concurrency)

        }

    })

    const wxDownloadFile = wx.downloadFile ;

    Object.defineProperty(wx, 'downloadFile', {

        get() {

            return queueRequest(wxDownloadFile, concurrency)

        }

    })

    const qqDownloadFile = qq.downloadFile ;

    Object.defineProperty(qq, 'downloadFile', {

        get() {

            return queueRequest(qqDownloadFile, concurrency)

        }

    })

  }

  export {

    queueRequest,

    queue,

  }

然后在打包好的 小游戏项目里面的 game.js (因为是小游戏,所以是game.js,如果是小程序,那就应该是app.js)里面,加上这么两句调用一下:

//game.js 
import { queue } from './queue/index.js'
queue(10);

嗯哼,这样就大功告成啦,但是每次打包完都要手动复制和加那么两句话,实在是让人无语,本着程序猿懒惰的美德, 再弄个自动复制粘贴添加两行代码的 python 文件:

##copyqueue.py  说明一下, 这里是用的python3 
import os, shutil
from os import path

def copyFiles(source, target):
    if source is None or source is "":
        raise FileNotFoundError("源文件夹不能为空")
    if not path.exists(target):
        os.makedirs(target)  # 创建目标文件夹
    if path.isfile(source):  # 源目录是文件
        shutil.copy(source, target)
    else:
        target = path.join(target, path.split(source)[1])
        if not path.exists(target):
            os.makedirs(target)  # 创建目标文件夹
        for file in os.listdir(source):
            newFile = path.join(source, file)
            if path.isfile(newFile):
                shutil.copy(newFile, target)
            else:
                copyFiles(newFile, target)

target = 'F:\\*****\\wechatgame' #此处星号为省略路径,用你自己的真实路径就好了
source = 'F:\\*****\\queue' #此处星号为省略路径,用你自己的真实路径就好了

copyFiles(source,target)

# coding=UTF-8
filename = 'F:\\*****\wechatGame\\game.js'#此处星号为省略路径,用你自己的真实路径就好了

with open(filename, 'a') as file_object:
    file_object.write("\n\n")
    file_object.write("import { queue } from './queue/index.js'\n")
    file_object.write("queue(9);\n")

嗯哼,然后打包成exe 或者直接弄个bat文件执行以下 , 就ok了,下次双击就可以了~ ~(或者你其实也可以弄个插件,打包的时候顺便打包进去,时间有限我就不赘述啦);

想了想,我还是干脆把另外一个文件也copy进来给大家好了,到时候直接复制粘贴就能用了这轮子:

//queue.js
const checkConcurrency = (concurrency = 1) => {
    if (concurrency == null) {
        concurrency = 1
    }
    else if (concurrency === 0) {
        throw new Error('Concurrency must not be zero')
    }
    return concurrency
}

const onlyOnce = (fn) => (...args) => {
    if (fn === null) {
        throw new Error('Callback was already called')
    }
    const callFn = fn
    fn = null
    return callFn(...args)
}

export default function queue(callback, concurrency) {
    checkConcurrency(concurrency)

    // 待处理的队列
    let workers = []
    // 正在处理的队列
    const workerList = []

    return {
        concurrency,
        push(task, callback) {
            workers.push({
                task,
                callback,
            })
            setTimeout(() => {
                this.process()
            }, 0)
        },
        process() {
            while (this.concurrency > workerList.length && workers.length) {
                const worker = workers.shift()
                workerList.push(worker)
                callback(worker.task, onlyOnce((...args) => {
                    this.pull(worker)
                    if (typeof worker.callback === 'function') {
                        worker.callback(...args)
                    }
                    this.process()
                }))
            }
        },
        pull(worker) {
            const index = workerList.indexOf(worker)
            if (index !== -1) {
                workerList.splice(index, 1)
            }
        }
    }
}
 

好了,今天先到这儿了,有什么疑问的话欢迎随时交流~ 谢谢!! (另外,您有空也可以 上github的原轮子主人那里点个星星,哈哈哈哈,饮水不忘挖井人嘛~)

祝安好~ ~ O(∩_∩)O

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

推荐阅读更多精彩内容