2017-02-21 11 views
0

Я использую две функции, одну из которых переводит набор вопросов к следующему вопросу, а другой - для перемещения индикатора выполнения. Вопрос, который перемещает пользователя в nextQuestion, переопределяет первую функцию, а функция progressBar не обрабатывается.Только для выполнения функции Javascript при завершении предыдущей функции

Нет ошибок, и я изменил порядок или функции, и одна большая функция имеет одинаковый результат. Если я выполняю функции отдельно, обе функции работают идеально. Они начинаются с @onClick на кнопке.

Я попытался использовать обещания с тем же результатом.

Как я могу заставить функцию nextQuestion работать только при завершении progressBar?

Бар Прогресс

 progressBar: function(item){ 

     this.percentQuestion = 100/this.numberQuestions; 

     var elem = document.getElementById("myBar"); 

     var numericWidth = elem.style.width.replace(/\D/g,''); 

     var currentWidth = +numericWidth; 

     var newWidth = +numericWidth + +this.percentQuestion; 

     var id = setInterval(frame, 10); 
     function frame() { 
      if (currentWidth < newWidth) { 
      currentWidth++; 
      elem.style.width = currentWidth + '%'; 
      } else{ 
      clearInterval(id); 
      }; 

      }; 

     this.nextQuestion(item); 

    }, 

Следующий вопрос

 nextQuestion: function(item){ 

     var newKey = item + 1; 

     var y = document.getElementById('question' + item); 

     var x = document.getElementById('question' + newKey); 

      if(y.style.display === 'block'){ 
       y.style.display = 'none'; 
       x.style.display = 'block'; 
       console.log("Changed"); 
     }; 

     }, 

UPDATE

 nextQuestion: function(item){ 


     window.setTimeout(function() { function(item){ 

      var newKey = item + 1; 

      var y = document.getElementById('question' + item); 

      var x = document.getElementById('question' + newKey); 

       if(y.style.display === 'block'){ 
        y.style.display = 'none'; 
        x.style.display = 'block'; 
        console.log("Changed"); 
      }; 
     }, 1000); 

     }, 
+0

бегущий JSFiddle, которые создают ваш сценарий будет полезно. – janmvtrinidad

+0

Я не совсем уверен, что вы имеете в виду, но похоже, что вы должны поместить 'this.nextQuestion (item)' в 'else', после' clearInterval (id) '. – Razzildinho

ответ

1

ли следующие сделать ва ты хочешь?

progressBar: function(item){ 

    this.percentQuestion = 100/this.numberQuestions; 

    var variables = { 
     elem: document.getElementById("myBar"), 
     numericWidth: elem.style.width.replace(/\D/g,''), 
     currentWidth: +numericWidth, 
     newWidth: +numericWidth + +this.percentQuestion, 
    }; 

    // This isn't the nicest way of doing this but it should work 
    var that = this; 

    var id = setInterval(function(){ 
     frame(item, variables); 
    }, 10); 

    function frame(item, variables) { 
     if (variables.currentWidth < variables.newWidth) { 
     variables.currentWidth++; 
     variables.elem.style.width = variables.currentWidth + '%'; 
     } else{ 
     clearInterval(id); 
     that.nextQuestion(item); 
     }; 

    }; 
}, 
+0

Спасибо за это ... Теперь я получаю консольную ошибку 'this.nextQuestion не является функцией' –

+0

Я переместил' this' в переменную вне функции и передал элемент в 'frame()', но теперь получаю это ошибка 'Невозможно прочитать свойство 'style' of null. Как элемент не достигается в 'nextQuestion' –

+0

Только что отредактировал ответ, добавил' var that = this' вне функции 'frame()'. Это немного взломать, но он, надеюсь, сделает то, что вы хотите. – Razzildinho

0

Попробуйте с добавлением this.nextQuestion(item); внутри функции frame()

var self=this; 
function frame() { 
     if (currentWidth < newWidth) { 
     currentWidth++; 
     elem.style.width = currentWidth + '%'; 
     } else{ 
     clearInterval(id); 
     } 
    self.nextQuestion(item); 
    }; 

, как frame() выполняется в setInterval() вы будете иметь this.nextQuestion(item) в каждом интервале конца.

+0

Спасибо за это ... Теперь я получаю консольную ошибку 'this.nextQuestion не функция' –

+0

Я изменяю свой ответ. Пожалуйста, проверьте его снова, –

+0

Пожалуйста, см. Ответ @JamesParsons. Это должно работать сейчас. –

1

Вы можете использовать SetTimeout (HTML API)

написать функцию nextQuestion внутри метода SetTimeout.

window.setTimeout(function() { 
    function(item){ 
     var newKey = item + 1; 

     var y = document.getElementById('question' + item); 

     var x = document.getElementById('question' + newKey); 

     if(y.style.display === 'block'){ 
      y.style.display = 'none'; 
      x.style.display = 'block'; 
      console.log("Changed"); 
     }; 
    }, 1000); 
+0

Могу ли я узнать, кто и почему кто-то поддержал этот ответ, пожалуйста? – Jerome

+0

Я обновил свой вопрос, в настоящее время я получаю синтаксическую ошибку. Извините, что не использовал Timeout. @Jerome –

+0

@JamesParsons для меня вы не должны использовать тайм-аут! Вот почему я хочу знать, почему кто-то поддержал этот ответ, и, может быть, он может объяснить мне, почему – Jerome

0

магазин это в переменной первого затем просто перейти this.nextQuestion(item); к if (currentWidth < newWidth) { currentWidth++; elem.style.width = currentWidth + '%'; } else{ that.nextQuestion(item); clearInterval(id); };

+0

Теперь я получаю консольную ошибку 'this.nextQuestion не является функцией' –

+0

Извините, что этот контекст изменился. просто сначала сохраните это в переменной. –

+0

Мы почти там, я добавил 'function frame (item)', но все еще получаю 'Can not read property 'style' of null', как' item', не передается. –