js中如何移除定时器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js中如何移除定时器相关的知识,希望对你有一定的参考价值。

<!DOCTYPE html>
<html>
<head><title>Hello HTML5</title></head>
<body>
<progress id="progress" value="50" max="100">5/100</progress>
<input type="button" onclick="add()" value="增加"/>
<input type="button" onclick="minus()" value="减少"/>
<input type="button" onclick="auto_add()" value="自动增加"/>
<script>
function add()
var progress = document.getElementById("progress");
if(progress.value<100)
progress.value+=10;


function minus()
var progress = document.getElementById("progress");
if(progress.value>0)
progress.value-=10;


function auto_add()
var progress = document.getElementById("progress");
var t=window.setInterval("if(progress.value<100)progress.value+=1;",10);

</script>
</body>
</html>
以上是html5的代码,我想在点击了自动增加按钮后进度条自动填满,填满的时候自动移除interval,不然等填满了点击旁边的减少按钮,它还是会继续填充满

定时器一般有两个

1)setTimeout();//n毫秒后执行一次

2)setInterval();//每隔n秒执行一次

这两个方法都有个返回值,返回一个定时器id,可以定义一个变量接收


清除定时器方法:

setTimeout()对应的是 clearTimeout(id);

setInterval()对应的是 clearInterval(id);

下面有个例子:

<script>
    //setTimeout 1000ms后执行1次
   var i = setTimeout(function()
   ,1000);

    //setInterval 每隔1000ms执行一次
    var j = setInterval(function()

    ,1000)

    //清除Timeout的定时器,传入id(创建定时器时会返回一个id)
    clearTimeout(i);

    //清除Interval的定时器,传入id(创建定时器时会返回一个id)
    clearInterval(j);
</script>

参考技术A

js中两种定时器的设置及清除

    循环执行:

var timeid = window.setInterval(“方法名或方法”,“延时”);

window.clearInterval(timeid);

<script type="text/javascript">


$(document).ready(function()    //循环执行,每隔1秒钟执行一次 1000     var 

t1=window.setInterval(refreshCount, 1000);


function refreshCount()


console.log("ready");



//去掉定时器的方法  


window.clearInterval(t1);   


); 


</script>

2.定时执行:当方法执行完成定时器停止(但是定时器还在,只不过没用了);

var tmid = window.setTimeout(“方法名或方法”, “延时”);

window.clearTimeout(tmid);

<script type="text/javascript">


$(document).ready(function()    //定时执行,5秒后执行


var t1=window.setTimeout(refreshCount, 1000 * 5);    function refreshCount()


console.log("ready");


   //去掉定时器的方法      window.clearTimeout(t1);   


); 


</script>

参考技术B clearnInterval追问

我也知道用这个函数,但clearInterval需要个参数,不知道怎么填

追答

var timer=setInterval(.........);
clearInterval(timer);

追问

可以了 谢谢~~ 再请教下clearInterval(timer)之后,我在clear方法之后print了下timer,发现timer并没有被销毁,那如果我想判断timer是否还在运行,应该用什么方法?

Node.js/mongoose - 数组中的子文档不会删除/移除

【中文标题】Node.js/mongoose - 数组中的子文档不会删除/移除【英文标题】:Node.js/mongoose - sub-document in a array won't delete/remove 【发布时间】:2019-01-01 08:47:47 【问题描述】:

所以这是我完成在线训练营后的第一个我自己的 node.js 项目。在我的数组中删除子文档时遇到问题。这是一些代码,我希望我能提供足够的信息来帮助我。

models:
var productSchema = new mongoose.Schema(
    name: String,
    type: String,
    location: String 
);

var clientSchema = new mongoose.Schema(
    name: String,
    address: String,
    contactinfo: String,
    products:[]    
);

这是我将产品添加到客户端的发布路线,效果很好:

//Add New Product
app.post("/clients/:id/products", middleware.isLoggedIn, function(req, res)
     Client.findById(req.params.id, function(err, client) 
            if(err)
              console.log(err);
              req.flash('error', "We cannot find the Client!!!");
              return res.redirect("/clients/" + req.params.id + "/products/new");
            
            Product.create(req.body.product, function(err, product)
                  if(err)
                  req.flash('error', "There was an error adding the product to the user, try again");
                   else
                       client.products.push(product);
                       client.save();
                       req.flash('success', "You have added a New Product");
                       res.redirect('/clients/' + req.params.id +'/products/new');
                   
            );
     );
);

我的删除路线是我的问题孩子。它删除了产品,但我似乎根本无法将它从阵列中取出。我做了一些研究并尝试了以下方法:

client.products.find(_id:req.params.product_id).remove()
client.products.id(req.params.product_id).remove()
client.products.pull(_id: req.params.product_id)
client.find(products:_id: req.params.product_id).remove()
using client.save() right after each

我收到错误或删除客户端, 但从不从数组中删除产品。任何帮助都会很棒,或者如果有更好的方法可以做到这一点,那也很棒。在寻求帮助之前尝试了一周,因此欢迎熟练的开发人员提供反馈。

哦,这是我最后的删除路线,我想我要禁用,直到找到修复程序,这样我才能继续我的项目。

//Delete a Product
app.delete("/clients/:id/products/:product_id", middleware.isLoggedIn, function(req, res)
Product.findByIdAndRemove(req.params.product_id, function(err)
    if(err)
        console.log(err);
     else 
        console.log("Should be deleted now!");
        Client.findById(req.params.id, function(err, client) 
            if(err)
                console.log(err);
            
            console.log(client.products.length);
            client.find(products: _id: req.params.product_id).remove();
            client.save();
            console.log(client.products.length);
            res.redirect("/clients/");
        );
    
);

);

我用来查看是否有任何改变但从未改变的长度。

【问题讨论】:

【参考方案1】:

首先,您的方法需要objectID。试试这样,看看它是否有效:

Product.findByIdAndRemove(ObjectId(req.params.product_id)

【讨论】:

感谢您提供此信息。我添加了它,但在我尝试时收到以下错误:ReferenceError: ObjectId is not defined 尝试了编辑后的版本,得到了同样的信息:ReferenceError: objectID is not defined 首先需要ObjectId函数 var ObjectId = require('mongodb').ObjectID; 或者尝试:Product.findByIdAndRemove(ObjectId("_id": req.params.product_id) 最终使用:var ObjectId = require('mongodb').ObjectId; Product.findByIdAndRemove(ObjectId(req.params.product_id), function(err) ---- 它从产品集合/表中删除了产品,但信息仍在数组中。【参考方案2】:

没关系,这里的问题似乎是我的代码。我没有在我的客户端模式中推送产品数组的引用,而是将产品信息直接推送到数组中。然后在我的一个区域的应用程序中,我正在访问 Product 集合中的数据,但在我的应用程序的另一部分,我正在通过 products 数组从客户端集合中访问相同的信息。根据我的培训(我创建的其他课程应用程序),似乎 ref 没有被删除它只是不能引用集合,因为它不再在集合中。

感谢 Laurentiu 和 Federico 看到这里并提供一些有用的信息。对于这可能给您造成的任何头痛,我们深表歉意。

【讨论】:

【参考方案3】:

查看了文档,它不会删除。它删除的是内容而不是 ID,因此它保留在 MongoDB 数据库中。

 router.delete('/inventario/:_id', function(req, res)
      Propiedades.findByIdAndDelete(req.params._id, function(err,)
         if (err)
             res.redirect('/inventario/');
          else 
             res.redirect('/inventario/');
       
    )
 );

【讨论】:

以上是关于js中如何移除定时器的主要内容,如果未能解决你的问题,请参考以下文章

如何按条件移除scheduledexecutorservice线程池中的任务

js 操作属性

ThreadPoolTaskScheduler动态添加、移除定时任务

js如何使自加中的定时器停止自加?

js两个页面的定时器互相影响

js定时器如何在执行完成以后往下执行