我想将延迟功能作为我的下划线链的一部分。 似乎延迟函数只能使用传递的显式参数 - 而不是包装器对象。 此代码不起作用(undefined不是函数异常):
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实例创建,然后延迟X ms的绑定到达UI。
答案 0 :(得分:0)
_.delay的第一个参数必须是一个函数,但如果是消息类(对象),则传递一个实例。 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);
答案 1 :(得分: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))
如果您不想将收藏集传递给chain()
并为收藏集的每个元素执行delay()
,请使用each()
而不是tap()
。
以下不是答案,因为它使用的是github.com/kriskowal/q承诺,而不是下划线.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();
});