8

(这个问题并不局限于语言,所以请随时提交其他语言的解决方案。)

我只是想知道是否可以在 JavaScript 中编写类似这样的内容:

// Wait 3 seconds and then say our message in an alert box
wait(3).then(function(){alert("Hello World!");});

传统方式是在哪里写

// Wait 3 seconds and then say our message in an alert box
setTimeout(function(){alert("Hello World!");}, 3000);

对不起,如果这是一个菜鸟问题:p

4

5 回答 5

37

您可以轻松编写它:

function wait(delay) {
  return {
    then: function (callback) {
      setTimeout(callback, delay*1000);
    }
  };
}

wait(3).then(function(){alert("Hello World!");});

如果您想深入了解,我建议您阅读有关currying偏函数应用程序的内容,这些主题非常有趣。

于 2009-09-18T17:08:58.743 回答
14

另一个版本,没有关闭:

function wait(seconds) {
    if(this instanceof wait)
        this.delay = seconds;
    else return new wait(seconds);
}

wait.prototype.then = function(callback) {
    setTimeout(callback, this.delay * 1000);
};

使用更多代码,您甚至可以重复调用函数:

function wait(seconds) {
    if(this instanceof wait)
        this.delay = seconds;
    else return new wait(seconds);
}

wait.prototype.then = function(callback) {
    setTimeout(callback, this.delay * 1000);
    return this;
};

wait.prototype.wait = function(seconds) {
    this.delay += seconds;
    return this;
};

var start = new Date;
function alertTimeDiff() {
    alert((new Date - start)/1000);
}

wait(1).then(alertTimeDiff).wait(3).then(alertTimeDiff);
于 2009-09-18T17:50:51.180 回答
2

链接更用于在一个对象上执行多个方法。因此,您宁愿将函数视为对象并在那里设置超时:

Function.prototype.callAfter = function(delay) {
    setTimeout(this, delay*1000);
};

(function(){alert("Hello World!");}).callAfter(3);
于 2009-09-18T17:22:25.933 回答
0

如果您使用 OO Javascript,那么是的,您可以进行方法链接。

一些流行的 JavaScript 框架可以做到这一点。 jQuery通过为通常不会返回值的函数返回 jQuery 对象来做到这一点。

于 2009-09-18T17:08:59.160 回答
0

我只是写了一个小助手来以某种一致的方式创建这样的 API,也许你喜欢它。

// > npm i mu-ffsm # install node dependency
var mkChained = require('mu-ffsm');

S这个想法是您通过调用入口函数来构建具有某种初始类型状态的流利的构建器。然后每个链式调用将状态转换为新状态。

您从链接一堆调用中获得的值可以作为一个函数执行,该函数调用 exit 以从该状态和您传入的任何选项构造一个值。

  • 条目:* ⟶ S
  • 过渡 : (S ⟶ *) ⟶ S
  • 退出 : S ⟶ (* ⟶ *)

例如

var API = mkChained({
  0:    function(opt)    {return ;/* create initial state */},
  then: function(s, opt) {return s; /* new state */},
  whut: function(s, opt) {return s; /* new state */},
  1:    function(s, opt) {return ;/* compute final value */}
});

所以01是入口,出口功能。所有其他功能都会转换内部状态。所有函数都可以接受参数,例如。opt

我们创建了一个我们新设计的 API 的实例,

var call = API() // entry
   .whut()       // transition
   .then()       // transition
   .whut();      // transition

并称它为

var result0 = call() // exit
  , result1 = call() // exit

看看(小)源代码,看看它是如何实现的。

附言。使用此答案更新文档:D

于 2014-07-16T13:01:06.370 回答