我想设置800ms的延迟时间来运行一个函数,所以我用一个计时器来处理它.代码如下.但是我发现,第一次,函数运行正常,它只显示一个console.log("这里是控制台....."); ,但是当我再次点击它时,它显示2个控制台,在第三次点击时,它显示3个控制台,依此类推......
我无法理解为什么会发生这种情况,任何朋友都可以为我解释一下吗?
import QtQuick 2.6
import QtQuick.Window 2.2
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
MouseArea {
anchors.fill: parent
onClicked: {
delayTimer(800,function(){
console.log("here is console.....");
var t= Math.random();
console.log(t);
})
}
}
Timer{
id:dtimer
}
function delayTimer(delayTime, cb) {
console.log("delayTimer is starting");
dtimer.interval = delayTime;
dtimer.repeat = false;
dtimer.triggered.connect(cb);
dtimer.start();
}
}
Run Code Online (Sandbox Code Playgroud)
点击几下,当我再次点击它时,输出是:
qml: delayTimer is starting
qml: here is console.....
qml: 0.27777099609375
qml: here is console.....
qml: 0.407012939453125
qml: here is console.....
qml: 0.60552978515625
qml: here is console.....
qml: 0.360107421875
qml: here is console.....
qml: 0.21942138671875
qml: here is console.....
qml: 0.252288818359375
qml: here is console.....
qml: 0.88134765625
qml: here is console.....
qml: 0.63092041015625
qml: here is console.....
qml: 0.5125732421875
Run Code Online (Sandbox Code Playgroud)
每次调用时delayTimer(),您都会将信号连接到插槽,因此连接会累积,并且会多次调用插槽.我不熟悉qml/js,但是你需要在触发超时后断开插槽:
function delayTimer(delayTime, cb) {
console.log("delayTimer is starting");
dtimer.interval = delayTime;
dtimer.repeat = false;
dtimer.triggered.connect(cb);
dtimer.triggered.connect(function(){
dtimer.triggered.disconnect(cb);
});
dtimer.start();
}
Run Code Online (Sandbox Code Playgroud)