本文整理了微盟小程序开发过程中遇到的一些问题。
问题一:
iOS时间转换问题怎么解决?pc端调试、安卓机都能正常执行,iOS上time的结果是null
var resData = ‘2017-3-14 10:03:45’
console.log(“返回时间:” + resData)
var time = Date.parse(new Date(resData)) ;
console.log(time);
解决方案:
将 ‘-’ 替换成 ‘/’
resData = resData.replace(/-/g, ‘/’);
问题二:
直播过程中可能会开始、暂停、继续、结束,客户端需要相应的做暂停和播放、结束,我们是希望通过消息的发送来通知到客户端,但是腾讯云IM的API调接口发群消息,限制 100次/秒,满足不了我们的需求
解决方案:
两点。
1、客户端轮询我们的接口,查询播放状态,舍弃。因为客户端数量过大时,服务端扛不住。
2、操作管理后台界面做轮询,一旦暂停,发送消息。客户端接口通过特定code跟普通消息做区分。
问题三:
storage不可以共用,小程序和插件之间数据共享有问题怎么解决呢?
解决方案:
插件使用小程序的共用方法(该方法由插件初始化时从构造函数传入),可以通过此方法从小程序发起请求、存储数据等。
问题四:
小程序的10层跳转限制怎么破?
解决方案:
判断一下当前页面长度是否达到10级,达到10级用redirectTo,未达到用navigateTo
var jumpUrl = function (data) {
let pages = getCurrentPages();
if (pages.length >= 10) {
wx.redirectTo({
url: data
})
} else {
wx.navigateTo({
url: data
})
}
}
问题五:
浮点运算的精度问题一般怎么解决?
解决方案:
先转成整数,再进行运算,最后进行除法运算。
列举一个减法运算:
function accSub(arg1, arg2) {
var r1, r2, m, n;
try {
r1 = arg1.toString().split(".")[1].length;
}
catch (e) {
r1 = 0;
}
try {
r2 = arg2.toString().split(".")[1].length;
}
catch (e) {
r2 = 0;
}
m = Math.pow(10, Math.max(r1, r2)); //动态控制精度长度
n = (r1 >= r2) ? r1 : r2;
return ((arg1 * m - arg2 * m) / m).toFixed(n);
}
问题六:
小程序二维码scene的长度限制最多32位可见字符,这个有什么妙招吗
解决方案:
1、中间页 + 短参数
新建一个中间空白跳转页面,每次生成的二维码都是这个页面,
访问这个页面时,将参数中的scene的值,去指定接口获取完整的 带参数的链接,
然后跳转过去,适用于一个解决方案中有很多个页面需要生成二维码来跳转;
2、短参数
二维码指向到特定页面,scene值为短参数,进入页面时请求接口获取完整的参数(json格式);
问题七:
还有一个图片预加载问题,有些活动图片太多太大,且不确定使用哪张图片,接口返回数据时即刻显示图片可能出现短暂空白的问题
解决方案:
分三步,你需要建立一个图片预加载器
1、js
/**
* 图片预加载组件
*/
class ImgLoader {
/**
* 初始化方法,在页面的 onLoad 方法中调用,传入 Page 对象及图片加载完成的默认回调
*/
constructor(pageContext, defaultCallback) {
this.page = pageContext
this.defaultCallback = defaultCallback || function () { }
this.callbacks = {}
this.imgInfo = {}
this.page.data.imgLoadList = [] //下载队列
this.page._imgOnLoad = this._imgOnLoad.bind(this)
this.page._imgOnLoadError=
this._imgOnLoadError.bind(this)
}
/**
* 加载图片
*
* @param {String} src 图片地址
* @param {Function} callback 加载完成后的回调(可选),第一个参数个错误信息,第二个为图片信息
*/
load(src, callback) {
if (!src) return;
let list = this.page.data.imgLoadList,
imgInfo = this.imgInfo[src]
if (callback)
this.callbacks[src] = callback
//已经加载成功过的,直接回调
if (imgInfo) {
this._runCallback(null, {
src: src,
width: imgInfo.width,
height: imgInfo.height
})
//新的未在下载队列中的
} else if (list.indexOf(src) == -1) {
list.push(src)
this.page.setData({ 'imgLoadList': list })
}
}
_imgOnLoad(ev) {
let src = ev.currentTarget.dataset.src,
width = ev.detail.width,
height = ev.detail.height
//记录已下载图片的尺寸信息
this.imgInfo[src] = { width, height }
this._removeFromLoadList(src)
this._runCallback(null, { src, width, height })
}
_imgOnLoadError(ev) {
let src = ev.currentTarget.dataset.src
this._removeFromLoadList(src)
this._runCallback('Loading failed', { src })
}
//将图片从下载队列中移除
_removeFromLoadList(src) {
let list = this.page.data.imgLoadList
list.splice(list.indexOf(src), 1)
this.page.setData({ 'imgLoadList': list })
}
//执行回调
_runCallback(err, data) {
let callback = this.callbacks[data.src] || this.defaultCallback
callback(err, data)
delete this.callbacks[data.src]
}
}
module.exports = ImgLoader
2、wxml
<template name=“img-loader”>
<image mode="aspectFill" wx:for="{{ imgLoadList }}" wx:key="*this" src="{{ item }}" data-src="{{ item }}" bindload="_imgOnLoad" binderror="_imgOnLoadError" style="width:0;height:0;opacity:0" />
</template>
3、使用
let images = [
'http://cdn.weimob.com/saas/activity/bargain/images/arms/shoulie.png',
'http://cdn.weimob.com/saas/activity/bargain/images/arms/shandian.png',
'http://cdn.weimob.com/saas/activity/bargain/images/arms/fengbao.png',
'http://cdn.weimob.com/saas/activity/bargain/images/arms/yingren.png',
'http://cdn.weimob.com/saas/activity/bargain/images/arms/leiming.png',
'http://cdn.weimob.com/saas/activity/bargain/images/arms/caidao.png',
'http://cdn.weimob.com/saas/activity/bargain/images/arms/liehen.png'
]
//初始化图片预加载组件,并指定统一的加载完成回调
this.imgLoader = new ImgLoader(this, null);
images.forEach(item => {
this.imgLoader.load(item)
})
问题八:
服务端时间和客户端时间问题,实际项目中有很多倒计时存在,服务端和客户端时间不对应会引起错乱。
解决方案:
将服务器时间通过接口下发给客户端,计算出二者的差值,计算倒计时的时候,可以将客户端时间加上这个差值来,再跟开始时间或结束时间计算倒计时。
如果你还有什么问题,欢迎在下方留言,我们会尽力为你解答。