2014-12-29 6 views
0

Я хочу запустить функцию задержки как часть моей линии подчеркивания. Кажется, что функция задержки работает только с явным аргументом, переданным, а не с объектом-оболочкой. Этот код не работает (не определено не является функцией исключения):Цепочка задержки функции

var message = function (text) { 
       var txt = text; 
       var show = function() { alert(txt); }; 
       return { 
        Text: txt, 
        Show: show 
       }; 
      }; 

_.chain(new message("hello")).delay(function(m) { m.Show(); }, 1000); 

Этот код работает:

var x = _.chain(new message("hello")).value(); 
      _.delay(function (m) { m.Show(); }, 1000, x); 

Есть ли способ сделать работу задержки внутри более функционального выражения?

E.g. Я хочу отменить создание экземпляра viewmodel, а затем отложить привязку к UI с помощью X ms.

+0

То, что вы пытаетесь сделать, не похоже на целенаправленную цель цепей. Может быть, вам стоит взглянуть на обещания. Например https://github.com/kriskowal/q, или вы можете попробовать те, что были созданы в jQuery. –

ответ

0

Что chain() делает в Подчеркивание только трубы аргумент всех следующих функций, передав его в качестве первого аргумента этих функций.

Поскольку первый аргумент delay() должен быть функцией, то для достижения функциональности вы хотите вы должны сделать что-то вроде этого:

_.chain(function(m) { 
     m.Show(); 
    }).delay(1000, new message("hello")); 

, но я предполагаю, что это не имеет структуру, которую вы хотите.

Таким образом, вы не можете использовать delay() напрямую, но вы можете использовать его с помощью tap():

_.chain(new message("hello")) 
    .tap(function(m) { 
     _.delay(function() { 
      m.Show(); 
     }, 1000); 
    }) 

или даже более сжато с использованием tap() и bind():

_.chain(new message("hello")) 
    .tap(_.delay.bind(null, function(m) { 
      m.Show(); 
    }, 1000)) 

Если вы Вана t передать в коллекцию chain() и сделать delay() для каждого элемента коллекции используйте each() вместо tap().


Ниже не ответ, как он использует довольно github.com/kriskowal/q обещания, чем underscore.js, но вот что я думаю, что вы пытаетесь сделать, а именно толкать что-то через трубопровод операций некоторые из них асинхронной:

var message = function (text) { 
       var txt = text; 
       var show = function() { alert(txt); }; 
       return { 
        Text: txt, 
        Show: show 
       }; 
      }; 


function delay(time) { 
    return function(m) { 
     var next = Q.defer(); 
     setTimeout(function() { 
      next.resolve(m); 
     }, 1000); 
     return next.promise; 
    } 
} 

Q.when(new message("hello")) 
    .then(delay(1000)) 
    .then(function(m) { 
     m.Show(); 
    }); 
+0

Вы правы. Это скорее поток обещаний.Я просто пытался сохранить представление другой библиотеки, такой как Q/when, поэтому я бы, вероятно, пошел с помощью приложения tap + bind или некоторое расширение, чтобы сделать его многоразовым. например _.lazy и _.delayedBind wrappers –

0

Первый аргумент _.delay должен быть функцией, но u передает экземпляр, если класс сообщения (объект). f.e.

var foo = function(){ 
    console.log('FOO'); 
} 
_.chain(foo).delay(200); 

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

var showMsg = function(){ 
    var msg = new message("hello"); 
    msg.Show(); 
}; 

_(showMsg).delay(200); 
+0

Когда я передаю ему экземпляр класса сообщений, он работает (вторая версия). Он не работает с _ объектом-оболочкой. Я отправил этот случай только, например, как я упоминал в. У меня есть более сложный сценарий построения режимов просмотра, предварительная загрузка данных, привязка их к представлениям и переключение между группами видимых видов. –

Смежные вопросы