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

vflash 22.12.2011 10:19

Цитата:

Сообщение от x-yuri
ничего не понял

есть цепочка. наполнение идет через вызов функции sync(A). Если A функция sync(function(){...}) то она просто добавляется . если sync() то добавиться блокировку и вернет функцию вызов которой снимет блокировку. дальше просто выполняем функции по цепочке, а если встречается блокировка то ждем пока не разблокируют.

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

x-yuri 22.12.2011 13:47

vflash, так тебе не цепочка, а defered тогда нужен

FINoM 22.12.2011 16:54

Цитата:

Сообщение от x-yuri
Во-первых, вызова первой функции ты не ждешь.

Я как бы жду, чтоб она выполнилась.
Цитата:

Сообщение от x-yuri
this.state = function(name, value) {...

Ну гетить и сетить значения чего-либо в методе — это я умею. Вот только не пойму, к чему это.

x-yuri 22.12.2011 17:06

к тому что на данный момент ты подразумеваешь, что значения будут передаваться между соседними функциями
waiting(function(runNext) {
    runNext(1, 2, 3, 4, 5, 6, 7, 8, 9);
})
.wait(function(runNext, v1, v2, v3, v4, v5, v6, v7, v8, v9) {...})
.wait(function(runNext, v1, v2, v3, v4, v5, v6, v7, v8, v9) {...})
.wait(function(runNext, v1, v2, v3, v4, v5, v6, v7, v8, v9) {...})
.wait(function(runNext, v1, v2, v3, v4, v5, v6, v7, v8, v9) {
    // и только здесь нам пригодятся эти значения
})

альтернативный вариант
new AsyncChain()
    .add(function(NEXT) {
        this.state('a1', 1);
        this.state('a2', 2);
        this.state('a3', 3);
        this.state('a4', 4);
        this.state('a5', 5);
        this.state('a6', 6);
        this.state('a7', 7);
        this.state('a8', 8);
        this.state('a9', 9);
        NEXT();
    })
    .add(function(NEXT) {...})
    .add(function(NEXT) {...})
    .add(function(NEXT) {...})
    .add(function(NEXT) {
        // а теперь используем их, this.state('a...');
    })
    .go();

FINoM 22.12.2011 17:20

x-yuri, не вижу смысла городить такой костыль. Человек, если ему захочется передавать через всю цепочку состояния переменных, может просто-напросто передавать объект.
wait(function(next){
  var states = {a: 1, b: 2}
  next(states);
}).wait(function(next, states){
  states.c = 3;
  next(states);
}).wait(function(next, states){
  states.d = 4;
  states.e = 5;
});

FINoM 22.12.2011 18:20

http://jsfiddle.net/finom/XSGub/52/ — сделал сделал this для всей цепочки одним объектом (раньше в первой функции this === window). Функции get и set здесь излишни, как по мне.
wait(function(next){
  this.blabla = {a:1,b:2}
  next();
}).wait(function(next){
  this.blabla.c = 3;
  next()
}).wait(next) {
  log(this.blabla); // {a:1, b:2, c:3}
});

Gozar 22.12.2011 19:00

Можно присоединится?,
сейчас в голову велосипед приехал:

var chain = function () {};

chain.prototype.deferred = [];

chain.prototype.add = function (fn) {
    this.deferred.push(fn);
    return this;
}
chain.prototype.next = function () {
    if (this.deferred.length) {
        this.deferred.shift().apply(this);
    }
}
chain.prototype.start = function () {
    this.deferred.shift().apply(this);
}




new chain().
    add(function(){
        var self = this;
        setTimeout(function () {
            console.log(1);
            self.next();
        }, 1000);
    }).
    add( function(){
        var self = this;
            setTimeout(function () {
                console.log(2);
                self.next();
            }, 1000);
    }).
    add( function(){
        console.log(3);
    }).
    start();

FINoM 22.12.2011 20:11

Цитата:

start();
Лишний метод. Если человек хочет запустить цепь потом, проще сделать так:
w = function(){
  return wait(...).wait(...)
}
w();

Цитата:

self.next();
Я сперва тоже так думал, но
var self = this;
тоже кажется излишним.

+ у тебя теряется целостность. Если последний коллбек сработал, следующие звенья не запустятся.

Gozar 22.12.2011 20:38

Цитата:

Сообщение от FINoM (Сообщение 145376)
Лишний метод. Если человек хочет запустить цепь потом, проще сделать так:
w = function(){
  return wait(...).wait(...)
}
w();

А как по поводу такого? Он не лишний, он позволяет делать так:

var chain = function () {};

chain.prototype.deferred = [];

chain.prototype.add = function (fn) {
    this.deferred.push(fn);
    return this;
}
chain.prototype.next = function () {
    if (this.deferred.length) {
        this.deferred.shift().apply(this);
    }
}
chain.prototype.start = function () {
    this.deferred.shift().apply(this);
}




var a = new chain().
    add(function(){
        var self = this;
        setTimeout(function () {
            console.log(1);
            self.next();
        }, 1000);
    }).
    add( function(){
        var self = this;
            setTimeout(function () {
                console.log(2);
                self.next();
            }, 1000);
    }).
    add( function(){
        console.log(3);
        this.next();
    });

setTimeout(function(){
    console.log('добавим чего-нибудь в цепь');
    a.add(function(){
        console.log(4);
    }).start();
},2000);



Цитата:

Сообщение от FINoM (Сообщение 145376)
Я сперва тоже так думал, но
var self = this;
тоже кажется излишним.

С этим пока не знаю что делать, может забить?

Цитата:

Сообщение от FINoM (Сообщение 145376)
+ у тебя теряется целостность. Если последний коллбек сработал, следующие звенья не запустятся.

Можно пример? Не понимаю.

FINoM 22.12.2011 21:14

Цитата:

А как по поводу такого?
Цитата:

С этим пока не знаю что делать, может забить?
Ну тебе виднее, это твой скрипт. Лично мне кажется лишним вызов конструктора.
Цитата:

Не понял?
Вот пример с большим таймаутом: http://jsfiddle.net/finom/XSGub/55/


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