【问题标题】:Add a sleep method in a object method chain(JS)在对象方法链中添加睡眠方法(JS)
【发布时间】:2015-04-10 10:19:21
【问题描述】:

我正在尝试在对象中添加一个 sleep 方法,该方法可以在方法链的中间调用。我考虑使用 setTimeout(),但无法阻止 javascript 线程,并且无法输出我想要的正确顺序。

<div id="test"></div>

 function hello(str){
  var text = document.getElementById("text");
  this.eat = function(kind){
    text.innerHTML += "<p>Eat "+ kind + "</p>";
    return this;
  }
  this.sleep = function(delay){
    setTimeout(function(){
      text.innerHTML += "<p>Sleep "+delay + "</p>";
    }, delay);
    return this;
  }
  text.innerHTML += "<p>Hello, "+ str + "</p>";
  return this;
}
var test = hello("guy").sleep(3000).eat("dinner"); 
/* I want an output as: 
      Hello, guy -> (wait 3 secs) Sleep 3000 -> Eat dinner
   But actually the output is:
      Hello, guy -> Eat dinner -> (wait 3 secs) Sleep 3000    
*/  

有人对此有任何想法吗?我应该使用原型还是其他方式来处理它?更重要的是,如果我想在这个对象中添加另一个名为sleepFirst 的方法。当我这样称呼它时:

var test2 = hello("boys").sleepFirst(2000).eat("lanch")

它输出:
(等待 2 秒) sleepFirst 2000 -> 你好,孩子们 -> 吃 lanch

我该怎么办?
(后记:我是Web开发的初学者,之前可能有人问过类似的问题,但我搜索了很久没有找到T^T我是中国人,对不起,我的英语可能看起来不太好很好。谢谢~~)

【问题讨论】:

  • 有趣的问题。 JS 是异步的,所以一种解决方法是向你的 sleep 方法添加一个回调,尽管那不会是一个链。另一种方法是队列系统stackoverflow.com/questions/14365318/…
  • @ArK 哦,是的!排队的方式可行!

标签: javascript settimeout method-chaining


【解决方案1】:

@RobG 说服我使用真实的对象定义重写您的代码。 JsFiddle here.

var sleeper = {
    text: document.getElementById("text"),
    eat: function (kind) {
        text.innerHTML += "<p>Eat " + kind + "</p>";
        return this;
    },
    sleep: function (delay, func, param) {
        setTimeout(function () {
            func(param);
            //text.innerHTML += "<p>Sleep " + delay + "</p>";
        }, delay);
        return this;
    },
    hello: function (str) {
        text.innerHTML += "<p>Hello, " + str + "</p>";
        return this;
    }
};

sleeper.hello("guy").sleep(3000, sleeper.eat, "dinner");

好多了。但这样一来,您将无法执行多个调用链。

【讨论】:

  • 请注意,this 引用了全局对象,这可能不是您所期望的,this.sleep = ...; 正在创建一个全局属性,而您不断返回 this,它是全局对象,所以你的代码相当于hello('guy'); sleep(...);。试试看。
  • [编辑因为你编辑了你的答案。]你说得对,我只是修改了这段代码以使其工作,而不是高效
  • @Amessihel 谢谢!另外有人建议我可以使用队列来处理它,我发现这是一种可行的方法link
  • 是的,我看到了!您也可以通过这种方式构建函数:function sleepyRun(delay1, call1, delay2, call2, ...) 您可以管理具有无限参数的函数。如果您想以这种方式查看,请参阅 [developer.mozilla.org/fr/docs/Web/JavaScript/Reference/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
  • 2018-03-17
相关资源
最近更新 更多