链接延迟功能

时间:2014-12-29 14:28:13

标签: javascript underscore.js

我想将延迟功能作为我的下划线链的一部分。 似乎延迟函数只能使用传递的显式参数 - 而不是包装器对象。 此代码不起作用(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。

2 个答案:

答案 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();
    });