2015-08-25 2 views
1

я только пройдя через исходный код typed.js и в основном основной функции в этом плагин использует шаблон проектирования многоразовых SetTimeout-х вложенных друг в друга, Посмотрите на код:Вложенные setTimeouts с тем же именем, любые последствия делают это?

self.timeout = setTimeout(function() { 
    // check for an escape character before a pause value 
    // format: \^\d+ .. eg: ^1000 .. should be able to print the^too using ^^ 
    // single^are removed from string 
    var charPause = 0; 
    var substr = curString.substr(curStrPos); 
    if (substr.charAt(0) === '^') { 
     var skip = 1; // skip atleast 1 
     if (/^\^\d+/.test(substr)) { 
      substr = /\d+/.exec(substr)[0]; 
      skip += substr.length; 
      charPause = parseInt(substr); 
     } 

     // strip out the escape character and pause value so they're not printed 
     curString = curString.substring(0, curStrPos); 
    } 

    if (self.contentType === 'html') { 
     // skip over html tags while typing 
     var curChar = curString.substr(curStrPos).charAt(0); 
     if (curChar === '<' || curChar === '&') { 
      var tag = ''; 
      var endTag = ''; 
      if (curChar === '<') { 
       endTag = '>'; 
      } else { 
       endTag = ';'; 
      } 
      while (curString.substr(curStrPos).charAt(0) !== endTag) { 
       tag += curString.substr(curStrPos).charAt(0); 
       curStrPos++; 
      } 
      curStrPos++; 
      tag += endTag; 
     } 
    } 

    // timeout for any pause after a character 
    self.timeout = setTimeout(function() { 
     if (curStrPos === curString.length) { 
      // fires callback function 
      self.options.onStringTyped(self.arrayPos); 

      // is this the final string 
      if (self.arrayPos === self.strings.length - 1) { 
       // animation that occurs on the last typed string 
       self.options.callback(); 

       self.curLoop++; 

       // quit if we wont loop back 
       if (self.loop === false || self.curLoop === self.loopCount) 
        return; 
      } 

      self.timeout = setTimeout(function() { 
       self.backspace(curString, curStrPos); 
      }, self.backDelay); 
     } else { 

      /* call before functions if applicable */ 
      if (curStrPos === 0) 
       self.options.preStringTyped(self.arrayPos); 

      // start typing each new char into existing string 
      // curString: arg, self.el.html: original text inside element 
      var nextString = curString.substr(0, curStrPos + 1); 
      if (self.attr) { 
       self.el.attr(self.attr, nextString); 
      } else { 
       if (self.isInput) { 
        self.el.val(nextString); 
       } else if (self.contentType === 'html') { 
        self.el.html(nextString); 
       } else { 
        self.el.text(nextString); 
       } 
      } 

      // add characters one by one 
      curStrPos++; 
      // loop the function 
      self.typewrite(curString, curStrPos); 
     } 
     // end of character pause 
    }, charPause); 

    // humanized value for typing 
}, humanize); 

Я не У меня есть проблема с пониманием кода выше, но я немного скептически отношусь к использованию нескольких setTimeouts внутри друг друга. С ИМЯ ИМЯ IE

self.timeout 

Это что-то нормально делать? есть ли какие-либо последствия использования setTimeouts, вложенных друг в друга? или этот подход кодирования полностью прекрасен. У меня был большой знак вопроса, когда я действительно видел setTimeouts в коде с тем же именем.

CODE ON GIT

Спасибо.

Alex-Z

+0

Я не думаю, что технически там возникает какая-либо проблема ... поскольку тайм-аут называется только один раз ... как только он называется, нет необходимости хранить ссылку на него ... но, как практика, это может быть confusing –

+0

Вы, кажется, не называете 'clearTimeout' в любом месте, так почему вы берете возвращаемое значение в первую очередь? – Quentin

+0

Ручка тайм-аута сбрасывается при вызове таймаута. Это вполне приемлемый способ управления дескриптором. Ручка - это просто объект «Number». – Blindman67

ответ

1

Там нет никаких проблем, назначая множественным setTimeout() возвращаемые значения одной и той же переменной self.timeout.

Но вы потеряете возможность сбросить все предыдущие таймауты с clearTimeout(), так как self.timeout каждый раз перезаписывается с последним setTimeout() возвращаемым значением.

Однако в приведенном вами конкретном примере кода clearTimeout() не используется. Таким образом, при отсутствии своей цели присвоение возвращаемого значения той же переменной self.timeout также бесполезно.

Смежные вопросы