22.12.2011, 10:19
|
|
Профессор
|
|
Регистрация: 09.07.2007
Сообщений: 304
|
|
Сообщение от x-yuri
|
ничего не понял
|
есть цепочка. наполнение идет через вызов функции sync(A). Если A функция sync(function(){...}) то она просто добавляется . если sync() то добавиться блокировку и вернет функцию вызов которой снимет блокировку. дальше просто выполняем функции по цепочке, а если встречается блокировка то ждем пока не разблокируют.
как пример применения. нужно сделать несколько асинх. запросов, дождаться их завершения и выполнить какую-то функцию. Тоесть ставим несколько блокировок, а после них нужную функцию. А вот в методом FINoM такое не сделать.
|
|
22.12.2011, 13:47
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
vflash, так тебе не цепочка, а defered тогда нужен
Последний раз редактировалось x-yuri, 22.12.2011 в 17:06.
|
|
22.12.2011, 16:54
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Сообщение от x-yuri
|
Во-первых, вызова первой функции ты не ждешь.
|
Я как бы жду, чтоб она выполнилась.
Сообщение от x-yuri
|
this.state = function(name, value) {...
|
Ну гетить и сетить значения чего-либо в методе — это я умею. Вот только не пойму, к чему это.
|
|
22.12.2011, 17:06
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
к тому что на данный момент ты подразумеваешь, что значения будут передаваться между соседними функциями
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();
|
|
22.12.2011, 17:20
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
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;
});
|
|
22.12.2011, 18:20
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
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}
});
|
|
22.12.2011, 19:00
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
Можно присоединится?,
сейчас в голову велосипед приехал:
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();
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
|
|
22.12.2011, 20:11
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Лишний метод. Если человек хочет запустить цепь потом, проще сделать так:
w = function(){
return wait(...).wait(...)
}
w();
Я сперва тоже так думал, но
var self = this;
тоже кажется излишним.
+ у тебя теряется целостность. Если последний коллбек сработал, следующие звенья не запустятся.
|
|
22.12.2011, 20:38
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
Сообщение от FINoM
|
Лишний метод. Если человек хочет запустить цепь потом, проще сделать так:
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
|
Я сперва тоже так думал, но
var self = this;
тоже кажется излишним.
|
С этим пока не знаю что делать, может забить?
Сообщение от FINoM
|
+ у тебя теряется целостность. Если последний коллбек сработал, следующие звенья не запустятся.
|
Можно пример? Не понимаю.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Последний раз редактировалось Gozar, 22.12.2011 в 20:45.
|
|
22.12.2011, 21:14
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Цитата:
|
А как по поводу такого?
|
Цитата:
|
С этим пока не знаю что делать, может забить?
|
Ну тебе виднее, это твой скрипт. Лично мне кажется лишним вызов конструктора.
Вот пример с большим таймаутом: http://jsfiddle.net/finom/XSGub/55/
|
|
|
|