22.12.2011, 21:37
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
Сообщение от FINoM
|
Вот пример с большим таймаутом
|
Я возможно понял, что ты имеешь в виду.
Т.к. функции добавляются в стек, то и выниматься они будут в той же последовательности. Поэтому никаких нарушений работы скрипта не предвидится.
Я к тому веду, что как мне используя твою функцию собрать цепочку, но не запускать её? Обернуть в функцию, а потом ещё раз и ещё раз, добавляя по звену, если мне нужно собирать звенья через таймауты(допустим ajax)?
Примеры получаются какие-то абстрактные.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
|
|
22.12.2011, 21:50
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
По поводу передачи переменных между функциями я буду использовать сеттеры/геттеры, меньше геморроя, а код понятнее. Я как-то делал подобным образом, как у тебя. Если код разрастается фиг поймешь что, куда передал.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
|
|
22.12.2011, 22:14
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Цитата:
|
Я к тому веду, что как мне используя твою функцию собрать цепочку, но не запускать её?
|
Я уже говорил:
w = function(last){
return wait(function(next){...}).wait(function(next){...}).wait(last)
}
потом, если хочешь запустить, добавив еще функций в стек, пишешь:
w(function(next){...}).wait(funciton(next){...}).wait(function(next){...});
|
|
22.12.2011, 22:31
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
Я уже запутался, что и как вызывать. То w добавляет в цепочку, то wait да ещё и в функцию обернуть.
Останемся каждый при своём, тебе наверное так удобнее.
Кстати:
var self = this;
можно не писать, если сделать так:
var c = new chain();
c.
add(function(){
setTimeout(function () {
c.next();
}, 1000);
}).
...
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Последний раз редактировалось Gozar, 22.12.2011 в 23:58.
|
|
23.12.2011, 06:27
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
Сообщение от FINoM
|
x-yuri, не вижу смысла городить такой костыль. Человек, если ему захочется передавать через всю цепочку состояния переменных, может просто-напросто передавать объект.
|
давай называть вещи своими именами. У тебя цепочка функций без состояния. И если нужно добавить состояние, ты его передаешь через параметры функций. У меня цепочка функций - это объект с состоянием. Внимание вопрос, что из этого костыль? Что есть заворачивание цепочки в функцию, чтобы она не вызвалась?
Сообщение от FINoM
|
http://jsfiddle.net/finom/XSGub/52/ — сделал сделал this для всей цепочки одним объектом (раньше в первой функции this === window). Функции get и set здесь излишни, как по мне.
|
а теперь непонятно, откуда взялся this. У тебя там только функции.
ты можешь упираться ногами и руками против использования объектов, но что это тебе даст?
Сообщение от Gozar
|
Примеры получаются какие-то абстрактные.
|
прямо в точку у кого-нибудь возникала необходимость в этих самых цепочках? Или мы опять решаем абстрактную задачу?
|
|
23.12.2011, 10:47
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Сообщение от x-yuri
|
у кого-нибудь возникала необходимость в этих самых цепочках?
|
Скорее не хватило знаний/опыта и этот вариант им кажется самым логичным и лёгким. Вот и вся необходимость.
Если погуглить, то асинхронные приложения писались задолго до появления NodeJS и уже выработались соответствующие паттерны. Но в JS как всегда всё по-своему
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
|
|
23.12.2011, 11:30
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
я считаю, что есть прямые пути, а есть обходные. Я предпочитаю ходить напрямик, если нету причин ходить в обход. Ваши причины для меня не причины (недостаточные причины). Нехватка знаний/опыта ни при чем. Они в лучшем случае (или худшем, это как посмотреть) помогают ходить в обход, но с причинами никак не связаны. И если так, то даже хорошо, что не хватило.
а асинхронное программирование, о котором можно погуглить, - нечто совсем отличное от асинхронного программирования в js.
Сообщение от B~Vladi
|
Если погуглить, то асинхронные приложения писались задолго до появления NodeJS и уже выработались соответствующие паттерны. Но в JS как всегда всё по-своему
|
абстрактно: другой контекст - другое решение. Но ты можешь попробовать привести эти паттерны асинхронного программирования, которые js-программисты отказываются принимать.
|
|
23.12.2011, 12:16
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Сообщение от x-yuri
|
а теперь непонятно, откуда взялся this. У тебя там только функции.
|
Да, и в этих функциях this относится к анонимному классу, а не к window.
Сообщение от x-yuri
|
Или мы опять решаем абстрактную задачу?
|
Мы решаем задачу поочередного вызова асинхронных функций. Ты предложил сделать объект состояний и функции-геттеры и -сеттеры, я посчитал, что this.state = {} или this.miyobiekt = {} более подходящее решение, чем функции (главное не переопределить объекты в классе). Что не так?
Сообщение от B~Vladi
|
Скорее не хватило знаний/опыта и этот вариант им кажется самым логичным и лёгким.
|
Есть другие варианты (кроме аналогов моего костыля, которых достаточно много)?
|
|
23.12.2011, 12:31
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
Сообщение от FINoM
|
Да, и в этих функциях this относится к анонимному классу, а не к window.
|
до этого не сложно догадаться, но в моем случае объект присутствует явно, и к чему относится this очевидно. Или по-другому: у тебя там только функции, причем здесь this? А у меня есть объект.
Сообщение от FINoM
|
Мы решаем задачу поочередного вызова асинхронных функций. Ты предложил сделать объект состояний и функции-геттеры и -сеттеры, я посчитал, что this.state = {} или this.miyobiekt = {} более подходящее решение, чем функции (главное не переопределить объекты в классе). Что не так?
|
отсутствует связь с реальностью. Где конкретные примеры, которые эта "библиотека" должна решать? Хорошие библиотеки возникают из решения практических задач, а не из теоретических рассуждений. Я тебе советую заняться не библиотеками, а задачами. А библиотеки, они сами появятся.
...продолжу. FINoM, ты стараешься не усложнять. Это твоя причина. Я тоже так старался делать. Но в результате такие решения не выдерживали столкновения с практикой и приходилось их доделывать. B~Vladi, ты делаешь вид что проблемы не существует в ущерб разбиению на классы что ли. Причина: производительность и прямолинейность. Прямолинейность делает реализацию прозрачной, но при этом сложно увидеть намерения. Прозрачность намерений или выразительность - это тот самый прямой путь, о котором я говорил.
|
|
23.12.2011, 13:34
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Сообщение от x-yuri
|
библиотека
|
Я нигде не называл это библиотекой.
Сообщение от x-yuri
|
Где конкретные примеры
|
Примеры я уже приводил, вот хотя-бы этот:
Цитата:
|
Рассмотрим пример (который взят из головы и в нем возможны ошибки) гипотетического парсера сайта, который после парсинга заносит данные в БД, и, после занесения, вызывает некоторый код.
var html = '';
request.on('response', function (response) {
response.on('data', function (chunk) {
html = html + chunk;
});
response.on('end', function() {
//какой-то парсер
parse(html, function(data){
//какая-нибудь функция, добавляющая данные в базу
addToDatabase(data, function() {
doSomething();
})
});
});
});
Много вложенных колбеков — не есть гуд, пробуем по-другому.
var html = '';
var responceOnEnd = function() {
parse(html, parsed);
}
var parsed = function(data){
addToDatabase(data, addedToDatabase)
}
var addedToDatabase = function() {
doSomething();
}
request.on('response', function (response) {
response.on('data', function (chunk) {
html = html + chunk;
});
response.on('end', responceOnEnd);
});
Но здесь несколько лишних переменных, в которых так же можно запутаться.
Я предлагаю сделать вот так:
wait(function(runNext){
request.on('response', runNext);
}).wait(function(runNext, response){
response.on('data', function (chunk) {
html = html + chunk;
});
response.on('end', function() {
runNext(html);
});
}).wait(function(runNext, html){
parse(html, runNext);
}).wait(function(runNext, data){
addToDatabase(data, runNext);
}).wait(function(){
doSomething();
})
|
Сообщение от x-yuri
|
до этого не сложно догадаться, но в моем случае объект присутствует явно, и к чему относится this очевидно. Или по-другому: у тебя там только функции, причем здесь this? А у меня есть объект.
|
Это дело твоё, хочешь, напиши функции setState, getState, я ведь тебе не указ, как и ты мне. Пишем так, как каждый считает лучшим, не без советов, к которым я стараюсь прислушиваться.
Сообщение от x-yuri
|
ты стараешься не усложнять
|
Да, ты прав, я люблю, когда всё просто. Самые популярные вещи — просты в использовании, посмотри на ту же "быдло-библиотеку" jQuery.
Сообщение от x-yuri
|
Но в результате такие решения не выдерживали столкновения с практикой и приходилось их доделывать.
|
А если усложнить, то, вполне возможно, придется переделывать. Ты сам пишешь:
Сообщение от x-yuri
|
Хорошие библиотеки возникают из решения практических задач
|
что бы это не значило, нужно отталкиваться от практических задач.
|
|
|
|