я только пройдя через исходный код 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
в коде с тем же именем.
Спасибо.
Alex-Z
Я не думаю, что технически там возникает какая-либо проблема ... поскольку тайм-аут называется только один раз ... как только он называется, нет необходимости хранить ссылку на него ... но, как практика, это может быть confusing –
Вы, кажется, не называете 'clearTimeout' в любом месте, так почему вы берете возвращаемое значение в первую очередь? – Quentin
Ручка тайм-аута сбрасывается при вызове таймаута. Это вполне приемлемый способ управления дескриптором. Ручка - это просто объект «Number». – Blindman67