我在实现一个需求:播放视频广告,如果播放失败,就算了直接发放奖励。
正常的操作应该监听onError
方法,如果获取广告失败了,我通过业务手段知道也是可以的。
但是我图偷懒,在调用RewardedVideoAd.show()
时,如果发生错误会报{errMsg: "no advertisement data available, please invoke load()"}
那么我直接在调用RewardedVideoAd.show()
用try包裹不就好了吗?
以下是实测代码
adPlay() {
// 播放广告
try { // 播放失败就不播了
rewardedVideoAd.show()
return;
} catch (error) {
console.error('广告播放失败', error)
}
// 发放奖励
this.postAward()
}
然而实际情况是,系统在报了
Unhandled promise rejection {errMsg: "no advertisement data available, please invoke load()"}
就没有然后了,甚至不会走到conposer.error
。
解决方案是加上async/await
操作后就可以解决了,解决代码如下
async adPlay() {
// 播放广告
try { // 播放失败就不播了
await rewardedVideoAd.show() // 注意:这里必须加await 否则报错是系统级别的 不会被try捕获
return;
} catch (error) {
console.error('广告播放失败', error)
}
// 发放奖励
this.postAward()
}
猜测是因为RewardedVideoAd.show()
调用了“系统原生”方法,返回的Promise
类如果没被正确处理,将会终止操作。