public showVideo(options:object, cb: (retCode: ADRetcode, retErr: string) => void) {
Logger.debug('创建激励视频广告')
videoAd = this.app.createRewardedVideoAd(options)
videoAd.load()
.then(() => {
videoAd.show()
.then(() => Logger.debug('激励视频显示成功'))
.catch(err => {
Logger.error('激励视频显示失败: ' + JSON.stringify(err))
// 显示失败回调
Utils.call_once(cb, ADRetcode.Error, '激励视频显示失败:' + JSON.stringify(err))
}
)
})
.catch(err => {
Logger.error('激励视频加载失败: ' + JSON.stringify(err))
// 加载失败回调
Utils.call_once(cb, ADRetcode.Error, '激励视频加载失败:' + JSON.stringify(err))
}
)
// 错误监听
let onVideoAdError = function(err) {
Logger.error('[WXSDK] 激励视频出现异常: ' + JSON.stringify(err))
// 出错的同时移除事件监听,防止重复触发
removeAllListener()
// 异常回调
Logger.debug('[WXSDK] onVideoAdError======>cb:', cb, cb['isDeleted'], typeof cb)
Utils.call_once(cb, ADRetcode.Error, '激励视频出现异常: ' + JSON.stringify(err))
}
videoAd.onError(onVideoAdError)
}
/**
* 执行即销毁的函数
* @param func
* @param args
*/
static call_once(func, ...args) {
func && func(...args)
Logger.debug('回调函数调用时间:' + new Date().getTime())
func = null
}
最近在学习公司的代码,按照代码在激励视频创建成功或者失败都会调用回调函数,调用回调函数使通过call_once()来执行的,在执行完过后将回调函数设为null,避免回调的重复执行。
但是最近发现在创建激励视频失败时先在onError()中执行回调函数,然后又在load().catch()中再次执行,但是回调函数应该在第一次调用之后就变成了null才对,而且似乎也不能才call_once()中将cb重写。
请问各位大佬这是什么原因?是因为回调函数还有其他的引用吗?
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…