Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Мой синхронный костыль (https://javascript.ru/forum/project/24115-mojj-sinkhronnyjj-kostyl.html)

Gozar 22.12.2011 21:37

Цитата:

Сообщение от FINoM (Сообщение 145381)
Вот пример с большим таймаутом

Я возможно понял, что ты имеешь в виду.

Т.к. функции добавляются в стек, то и выниматься они будут в той же последовательности. Поэтому никаких нарушений работы скрипта не предвидится.

Я к тому веду, что как мне используя твою функцию собрать цепочку, но не запускать её? Обернуть в функцию, а потом ещё раз и ещё раз, добавляя по звену, если мне нужно собирать звенья через таймауты(допустим ajax)?

Примеры получаются какие-то абстрактные.

Gozar 22.12.2011 21:50

По поводу передачи переменных между функциями я буду использовать сеттеры/геттеры, меньше геморроя, а код понятнее. Я как-то делал подобным образом, как у тебя. Если код разрастается фиг поймешь что, куда передал.

FINoM 22.12.2011 22:14

Цитата:

Я к тому веду, что как мне используя твою функцию собрать цепочку, но не запускать её?
Я уже говорил:
w = function(last){
  return wait(function(next){...}).wait(function(next){...}).wait(last)
}


потом, если хочешь запустить, добавив еще функций в стек, пишешь:
w(function(next){...}).wait(funciton(next){...}).wait(function(next){...});

Gozar 22.12.2011 22:31

Я уже запутался, что и как вызывать. То w добавляет в цепочку, то wait да ещё и в функцию обернуть.

Останемся каждый при своём, тебе наверное так удобнее.

Кстати:
var self = this;

можно не писать, если сделать так:

var c = new chain();

    c.
    add(function(){
        setTimeout(function () {

            c.next();

        }, 1000);
    }).
...

x-yuri 23.12.2011 06:27

Цитата:

Сообщение от FINoM
x-yuri, не вижу смысла городить такой костыль. Человек, если ему захочется передавать через всю цепочку состояния переменных, может просто-напросто передавать объект.

давай называть вещи своими именами. У тебя цепочка функций без состояния. И если нужно добавить состояние, ты его передаешь через параметры функций. У меня цепочка функций - это объект с состоянием. Внимание вопрос, что из этого костыль? Что есть заворачивание цепочки в функцию, чтобы она не вызвалась?

Цитата:

Сообщение от FINoM
http://jsfiddle.net/finom/XSGub/52/ — сделал сделал this для всей цепочки одним объектом (раньше в первой функции this === window). Функции get и set здесь излишни, как по мне.

а теперь непонятно, откуда взялся this. У тебя там только функции.

ты можешь упираться ногами и руками против использования объектов, но что это тебе даст?

Цитата:

Сообщение от Gozar
Примеры получаются какие-то абстрактные.

прямо в точку :yes: у кого-нибудь возникала необходимость в этих самых цепочках? Или мы опять решаем абстрактную задачу?

B~Vladi 23.12.2011 10:47

Цитата:

Сообщение от x-yuri
у кого-нибудь возникала необходимость в этих самых цепочках?

Скорее не хватило знаний/опыта и этот вариант им кажется самым логичным и лёгким. Вот и вся необходимость.
Если погуглить, то асинхронные приложения писались задолго до появления NodeJS и уже выработались соответствующие паттерны. Но в JS как всегда всё по-своему :)

x-yuri 23.12.2011 11:30

я считаю, что есть прямые пути, а есть обходные. Я предпочитаю ходить напрямик, если нету причин ходить в обход. Ваши причины для меня не причины (недостаточные причины). Нехватка знаний/опыта ни при чем. Они в лучшем случае (или худшем, это как посмотреть) помогают ходить в обход, но с причинами никак не связаны. И если так, то даже хорошо, что не хватило. ;)

а асинхронное программирование, о котором можно погуглить, - нечто совсем отличное от асинхронного программирования в js.

Цитата:

Сообщение от B~Vladi
Если погуглить, то асинхронные приложения писались задолго до появления NodeJS и уже выработались соответствующие паттерны. Но в JS как всегда всё по-своему

абстрактно: другой контекст - другое решение. Но ты можешь попробовать привести эти паттерны асинхронного программирования, которые js-программисты отказываются принимать.

FINoM 23.12.2011 12:16

Цитата:

Сообщение от x-yuri
а теперь непонятно, откуда взялся this. У тебя там только функции.

Да, и в этих функциях this относится к анонимному классу, а не к window.
Цитата:

Сообщение от x-yuri
Или мы опять решаем абстрактную задачу?

Мы решаем задачу поочередного вызова асинхронных функций. Ты предложил сделать объект состояний и функции-геттеры и -сеттеры, я посчитал, что this.state = {} или this.miyobiekt = {} более подходящее решение, чем функции (главное не переопределить объекты в классе). Что не так?
Цитата:

Сообщение от B~Vladi
Скорее не хватило знаний/опыта и этот вариант им кажется самым логичным и лёгким.

Есть другие варианты (кроме аналогов моего костыля, которых достаточно много)?

x-yuri 23.12.2011 12:31

Цитата:

Сообщение от FINoM
Да, и в этих функциях this относится к анонимному классу, а не к window.

до этого не сложно догадаться, но в моем случае объект присутствует явно, и к чему относится this очевидно. Или по-другому: у тебя там только функции, причем здесь this? А у меня есть объект.

Цитата:

Сообщение от FINoM
Мы решаем задачу поочередного вызова асинхронных функций. Ты предложил сделать объект состояний и функции-геттеры и -сеттеры, я посчитал, что this.state = {} или this.miyobiekt = {} более подходящее решение, чем функции (главное не переопределить объекты в классе). Что не так?

отсутствует связь с реальностью. Где конкретные примеры, которые эта "библиотека" должна решать? Хорошие библиотеки возникают из решения практических задач, а не из теоретических рассуждений. Я тебе советую заняться не библиотеками, а задачами. А библиотеки, они сами появятся. ;)

...продолжу. FINoM, ты стараешься не усложнять. Это твоя причина. Я тоже так старался делать. Но в результате такие решения не выдерживали столкновения с практикой и приходилось их доделывать. B~Vladi, ты делаешь вид что проблемы не существует в ущерб разбиению на классы что ли. Причина: производительность и прямолинейность. Прямолинейность делает реализацию прозрачной, но при этом сложно увидеть намерения. Прозрачность намерений или выразительность - это тот самый прямой путь, о котором я говорил.

FINoM 23.12.2011 13:34

Цитата:

Сообщение от 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
Хорошие библиотеки возникают из решения практических задач

что бы это не значило, нужно отталкиваться от практических задач.


Часовой пояс GMT +3, время: 11:51.