当前位置: 首页 > news >正文

PlayCanvas的EventHandler.on函数修改了返回值导致链式调用无法进行

链式调用

    // Add pc.Application#tween methodpc.AppBase.prototype.tween = function (target) {return new pc.Tween(target, this._tweenManager);};

链式调用

var self = this
self.tweenFadeIn = self.app.tween(self.alpha)
.to(new pc.Vec3(1,0,0), self.fadeInTime, pc.Linear)
.on('update', function (dt) {for (var i = 0; i < self.images.length; i++) {self.images[i].element.opacity = self.alpha.x;}for (var i = 0; i < self.materials.length; i++) {self.materials[i].resource.opacity = self.alpha.x;self.materials[i].resource.update();}
})
.on('complete', function () {// 完成后的逻辑
});

PlayCanvas最近升级后,调用以上函数显示报错:

this.tweenFadeIn.start is not a function

在 JavaScript 中,方法链的写法通常是可以的,但在某些情况下,可能会因为上下文或返回值的问题导致链式调用失败。根据你提供的两种写法,第一种和第二种写法在逻辑上是相似的,但它们的效果取决于 self.app.tween(self.alpha) 返回的对象。
关键点
链式调用:在第一种写法中,self.app.tween(self.alpha) 返回的对象必须支持链式调用,也就是说,它的 to 和 on 方法应该返回 this,以便可以继续进行链式调用。
返回值:确保 self.app.tween(self.alpha) 返回的对象(即 Tween 实例)在调用 to 和 on 方法后没有被修改,仍然可以继续进行链式调用。
上下文问题:在某些情况下,this 的上下文可能会发生变化。如果你在链式调用中使用了不同的上下文(例如在某个回调函数中),可能会导致 this 指向错误的对象。

.on函数是在PlayCanvas的js库中定义的,查询event-handler.js,源代码摘录如下:

    on(name, callback, scope = this) {return this._addCallback(name, callback, scope, false);}_addCallback(name, callback, scope, once) {// #if _DEBUGif (!name || typeof name !== 'string' || !callback)console.warn(`EventHandler: subscribing to an event (${name}) with missing arguments`, callback);// #endifif (!this._callbacks.has(name))this._callbacks.set(name, []);// if we are adding a callback to the list that is executing right now// ensure we preserve initial list before modificationsif (this._callbackActive.has(name)) {const callbackActive = this._callbackActive.get(name);if (callbackActive && callbackActive === this._callbacks.get(name)) {this._callbackActive.set(name, callbackActive.slice());}}const evt = new EventHandle(this, name, callback, scope, once);this._callbacks.get(name).push(evt);return evt;}

_addCallback返回的不再是this,而是event,所有导致链式调用中断。需要将链式调用修改如下:

self.tweenFadeIn = self.app.tween(self.alpha);
self.tweenFadeIn.to(new pc.Vec3(1, 0, 0), self.fadeInTime, pc.Linear);
self.tweenFadeIn.on('update', function (dt) {for (var i = 0; i < self.images.length; i++) {self.images[i].element.opacity = self.alpha.x;}for (var i = 0; i < self.materials.length; i++) {self.materials[i].resource.opacity = self.alpha.x;self.materials[i].resource.update();}
});
self.tweenFadeIn.on('complete', function () {// 完成时的逻辑
});

修改以后调用就正确了。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 工 厂设计模式
  • 深度学习 vector 之模拟实现 vector (C++)
  • 无人机电子调速器详解!!!
  • 杀完进程,自动重启怎么办
  • Excel中的“块”操作
  • Python的基本数据类型
  • Kali Linux 命令大全
  • goweb框架-gin
  • 计算机Java项目|基于SpringBoot的实习管理系统的设计与实现
  • 计算机毕业设计 公寓出租系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • 打破接口壁垒:适配器模式让系统无缝对接
  • pytorch实现模型搭建
  • 如何利用chatgpt写文章,修改论文?
  • 【微信小程序】自定义组件 - 父子组件之间的通信
  • 自然语言处理系列三十四》 语义相似度》同义词词林》代码实战
  • @angular/forms 源码解析之双向绑定
  • 【笔记】你不知道的JS读书笔记——Promise
  • 【刷算法】从上往下打印二叉树
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 2017 前端面试准备 - 收藏集 - 掘金
  • C语言笔记(第一章:C语言编程)
  • ES6系统学习----从Apollo Client看解构赋值
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java,console输出实时的转向GUI textbox
  • Java程序员幽默爆笑锦集
  • MySQL几个简单SQL的优化
  • Promise面试题2实现异步串行执行
  • python 装饰器(一)
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 记一次用 NodeJs 实现模拟登录的思路
  • 聚簇索引和非聚簇索引
  • 前端_面试
  • 如何设计一个比特币钱包服务
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 网页视频流m3u8/ts视频下载
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 我看到的前端
  • 我这样减少了26.5M Java内存!
  • nb
  • 《码出高效》学习笔记与书中错误记录
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​1:1公有云能力整体输出,腾讯云“七剑”下云端
  • ​iOS实时查看App运行日志
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #APPINVENTOR学习记录
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #数据结构 笔记一
  • #预处理和函数的对比以及条件编译
  • $refs 、$nextTic、动态组件、name的使用
  • (16)Reactor的测试——响应式Spring的道法术器
  • (21)起落架/可伸缩相机支架
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (安卓)跳转应用市场APP详情页的方式
  • (分布式缓存)Redis分片集群
  • (附源码)计算机毕业设计SSM智慧停车系统