简体   繁体   English

Js 函数总是返回相同的值

[英]Js function always return the same values

Js beginner here. Js初学者在这里。

I have a function like this:我有一个这样的功能:

generateSteps: function() {
            var stepsLength = this.data.steps.length;
            var dataStepsInit = this.data.steps;
            for (var i = 0; i < stepsLength; i++) {
                var stepsItem = dataStepsInit[i].ITEM;
                var arrayItem = this.animationNodes[stepsItem - 1];
                var transition = this.animationParameters[i].transition;
                var options = this.animationParameters[i].options;
                var speed = this.animationParameters[i].speed;
                var delay = this.animationParameters[i].delay;
                arrayItem.delay(delay).show(transition, options, speed);

                if (dataStepsInit[i].AUDIOID) {
                    var audioClass = dataStepsInit[i].AUDIOID;
                    var audioPlayer = this.template.find("audio." + audioClass);

                    setTimeout(playAudioOnDelay,delay);
                };

                var playAudioOnDelay = function() {
                    audioPlayer[0].pause();
                    audioPlayer[0].currentTime = 0;
                    audioPlayer[0].play();
                };

            }
        }

What it does is generate data from JSON and display animated elements one by one on delay.它的作用是从 JSON 生成数据并延迟显示动画元素。 Animation part work fine.动画部分工作正常。 I can assign required animations and delay to DOM elements and show them in right order.我可以为 DOM 元素分配所需的动画和延迟,并以正确的顺序显示它们。

But what I want to do in the same time is also to play an audio on delay (so I use setTimeout).但我同时想做的也是延迟播放音频(所以我使用 setTimeout)。 Everything is almost fine, I play audio in right time (correct delay value) but I always play the same audio (which is last element) because audioPlayer always is the same DOM node.一切都很好,我在正确的时间(正确的延迟值)播放音频,但我总是播放相同的音频(这是最后一个元素),因为audioPlayer始终是同一个 DOM 节点。

I think this have something to do with this or I mixed a scope?我认为这与此有关还是我混合了一个范围?

Try this:尝试这个:

generateSteps: function() {
        var stepsLength = this.data.steps.length;
        var dataStepsInit = this.data.steps;
        for (var i = 0; i < stepsLength; i++) {
            var stepsItem = dataStepsInit[i].ITEM;
            var arrayItem = this.animationNodes[stepsItem - 1];
            var transition = this.animationParameters[i].transition;
            var options = this.animationParameters[i].options;
            var speed = this.animationParameters[i].speed;
            var delay = this.animationParameters[i].delay;
            arrayItem.delay(delay).show(transition, options, speed);

            if (dataStepsInit[i].AUDIOID) {
                var audioClass = dataStepsInit[i].AUDIOID;
                var audioPlayer = this.template.find("audio." + audioClass);

                setTimeout(playAudioOnDelay(audioPlayer),delay);
            };

        }

        function playAudioOnDelay(audioPlayer){
            return function(){
                audioPlayer[0].pause();
                audioPlayer[0].currentTime = 0;
                audioPlayer[0].play();
            }
        }
 }

Essentially, your problem looks like this: http://jsfiddle.net/po0rLnwo/本质上,您的问题如下所示: http : //jsfiddle.net/po0rLnwo/

The solution is : http://jsfiddle.net/gpfuo1s8/解决方案是: http : //jsfiddle.net/gpfuo1s8/

Check the console in your browser.检查浏览器中的控制台。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM