Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript方法链接挑战_Javascript_Method Chaining - Fatal编程技术网

JavaScript方法链接挑战

JavaScript方法链接挑战,javascript,method-chaining,Javascript,Method Chaining,(这个问题实际上并不局限于语言,所以请随时以其他语言提交解决方案。) 我只是想知道是否可以用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 setTi

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

我只是想知道是否可以用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);

抱歉,如果这是一个noob问题:p

您可以轻松编写:

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

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

如果你想深入研究,我建议你阅读,这些主题非常有趣。

如果你使用OO Javascript,那么是的,你可以使用方法链接


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

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

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

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

还有一个版本,没有结尾:

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);
我刚刚写了一篇文章,以某种一致的方式创建这样的API,也许你喜欢

// > npm i mu-ffsm # install node dependency
var mkChained = require('mu-ffsm');
其思想是通过调用一个entry函数来构造一个具有
S
类型初始状态的fluent生成器。然后,每个链式调用将状态转换为新状态

通过链接一组调用得到的值可以作为函数执行,该函数调用exit以从该状态和传入的任何选项构造值

  • 条目:*⟶
  • 过渡:(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 */}
});
因此,
0
1
是进入和退出功能。所有其他功能都转换为内部状态。 所有函数都可以接受参数,例如
opt

我们创建了一个新制作的API实例

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

var result0 = call() // exit
  , result1 = call() // exit
看一看(小的),看看这是如何实现的


注:用这个答案更新文档:D

我想你回答了你自己的问题……第二段代码怎么了?@Zoidberg:标题是方法链接,所以这里的问题不是让它工作,而是让它使用方法链接。@cemkalyoncu:我打字很快,我在任何地方都使用类似Vim的版本:-D@克里斯托夫:你的方法很好,我认为这比CMS更全面。但他回答问题的速度更快,所以我给了他正确的答案:p