![]() |
|
Модераторы: Sardar, Aliance |
![]()
|
|
| Dr.Zlo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 12.11.2007 Репутация: 1 Всего: 2 |
Я избавился от ошибки следующим образом:
После этого нормально стало всё работать и не косячить после последнего элемента. Если честно я до сих пор до конца не втыкаю как работает твой chain, это решение я нашёл интуитивно. Но по ходу ты пофиксил тем же способом и ужё ушёл намного дальше в разработку chain Вечером посмотрю и протестю твой новый вариант. |
|||
|
||||
| AKS |
|
|||
|
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
Смотрю и не могу понять - когда условие this instanceof Array будет истинным? Когда Вы "провернете" трюк из книжки? |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
AKS, Нееееее! Тут как раз все значительно интереснее ;-) объект chain это и ЕСТЬ настоящий массив честно сделанный через new Array!
Добавлено через 42 секунды this instanceof Array - проверка на то, вызывают ли нас первый раз. Тогда this указывает на объект window -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
AKS, Впрочем, Вы как всегда правы!
Первоначальное решение было опубликовано выше несколькими постами и последующие варианты лишь "облагораживали" его. Проявившееся желание написать chain(x).chain(y).chain(z)... породило совершенно логичную мысль о том, что каждая функция chain выдает некий объект как результат. причем первый chain в цепочке должен его (этот объект) породить. А так как по сути первый и последующие элементы цепочки одинаковы по входным параметрам, то родилась уникальная мысль написать конструкцию function chain(){..var x = new chain().... this.chain=chain/* Yoooo!!!*/ ...}; chain.prototype=new Array();, все в одном флаконе. ;-) Когда пришла пора "со всей этой фигней взлетать", возникла задача по определению контекста вызова chain(), new chain(), и .chain'а, рудиментарное наследие от которой до сих пор сидела в коде. по дороге напоролся на "баг", не позволяющий наследоваться от Array запланированным способом. Хорошо, что внезапно посетивший меня приступ здравого смысла заставил несколько оптимизировать код, но, к сожалению, не до конца. Так что, AKS, спасибо! -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Dr.Zlo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 12.11.2007 Репутация: 1 Всего: 2 |
ksnk, вчера внедрил chain в довольно большое приложение. Всё отлично работает,
Но есть несколько пожеланий. 1. Иногда нужно собрать chain по кусочкам, и только потом выполнить, или к примеру иногда удобней объявить chain где-нибудь в начале скрипта, а вызывать в нужных местах. Допустим у нас есть задача: для всех чётных элементов списка выполнить функцию по цепочке. Вот как я это вижу:
Было бы прикольно, если бы такая конструкция работала 2. После завершения chain лучше избавляться от созданного массива (обnullять его, что-ли), ведь если все эти массивы будут висеть в памяти, после нескольких вызовов chain скрипт будет заметно тормозиться |
|||
|
||||
| ksnk |
|
||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
До тех пор пока не вызван метод run, chain остается "не запущеным". Факт вызова очередной функции chain'а "автоматически" выкидывает первый элемент... как рожок в автомате - патрон стреляет - гильза вылетает imho, если переписать вашу конструкцию вот так
То я не вижу причин почему бы она не заработала... т.е. Все уже сделано ;-) Это сообщение отредактировал(а) ksnk - 30.1.2008, 09:49 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
||||
|
|||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Честно говоря меня преследует вопрос эстетический ;-) Удобно ли то, что "первая" функция называется Chain (с большой буквы). Можно было бы ради единообразия назвать ее chain (с маленькой), как и "собственный" метод. На каком-то этапе мне показалось идеологически более верно то, что первый элемент цепочки пишется с большой буквы. Правда до серьезного практического применения этой "идеологии" я пока не добрался.
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Dr.Zlo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 12.11.2007 Репутация: 1 Всего: 2 |
По поводу именования.
Думаю по фэн-шую было бы правильно создавать цепь, потом присоединять к ней звенья. Цепь по-английски chain, по поводу звеньев яндекс словари говорят следующее: звено ср. 1) link 2) (механизма или структуры) unit, section; part, branch 3) team, group, unit 4) (самолетов) flight 5) воен. level, echelon, squad Так как с link будут несколько другие ассоциации, то можно взять unit для определения звена цепи. В итоге можно договориться использовать конструкцию вроде: chain().unit(func1, param1).unit(func2, param2).unit(func3, param3).run(); В крайнем случае оставить всё как есть, только избавиться от Chain с большой буквы, он путает и сбивает с толку, как мне кажется |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
ok! Надо будет при случае поменять большую букву...
Насчет unit'а - я против... ;-) ; - я предполагал первонально, что будет вот так chain(func1, param1).chain(func2, param2).chain(func3, param3).run(); Единая сущьность для первой и последующих итераций... Imho, пусть так и остается. Всех изменений в скрипте, если надо - переназвать "головную" функцию... Это сообщение отредактировал(а) ksnk - 30.1.2008, 11:04 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Уже вторая страница, а я что-то не пойму сути вопроса...
Оно?
-------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Dr.Zlo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 12.11.2007 Репутация: 1 Всего: 2 |
Всё-таки отсроченный запуск chain не работает, я тестировал, просто не запускается и всё. Вот исходник:
Кстати, ещё одна интересная тема для размышлений- можно ли chain замкнуть на саму себя, чтоб все операции выполнялись в цикле заданное количество раз, либо бесконечно, пока мы насильно не остановим chain? Добавлено @ 15:08 Sardar, в твоём случае функции выполняются одновременно, а суть chain состоит в том, чтоб выполнять их последовательно, чтоб к примеру сначала выполнилась анимация, после завершения анимации выполнилась логика, после завершения логики вторая анимация и т.п. В этом-то и суть вопроса Это сообщение отредактировал(а) Dr.Zlo - 30.1.2008, 15:19 |
|||
|
||||
| ksnk |
|
||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Согласен... Зато твой - определение "нечетности", а не "четности" ;-) Вот такая правка исправит ситуацию... Первым элементом цепочки оказывалась undefined конструкция, которая генерировалась Chain()'ом...
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
||||
|
|||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Да , еще вот это я поменял
Добавлено через 57 секунд Хотя, как было - тоже работает ... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Обновил листинг функции... теперь в этом примере она еще и прекращать анимацию, в том числе и от jQuery, умеет корректно...
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
А ты попробуй -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
![]()
|
| Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |