js timer启动两次怎么停止呀?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js timer启动两次怎么停止呀?相关的知识,希望对你有一定的参考价值。

比如
var timer;
timer = window.setInterval("Readcadetimer()", 1000);
timer = window.setInterval("Readcadetimer()", 1000);
执行了两遍timer
然后
clearInterval(timer);
然后这个timer还是可以用;
还有一个问题就是
执行
timer = window.setInterval("Readcadetimer()", 1000);
之后
timer 的值是一个数字这个数字代表什么意思?

楼主你首先得分清setInterval和setTimeout的区别。

    var handler = setInterval(action, intervalTime):从运行这行代码开始,每隔intervalTime(单位是毫秒)的时间就把action执行一次,直到运行至调用clearInterval(handler)为止。

    var handler = setTimeout(action, delayTime):从运行这行代码开始计时,等到delayTime(单位是毫秒)的时刻立即把action执行一次。在没到达delayTime时刻之前你可以调用clearTimeout(handler)来清除这次调用。

现在来看你的问题,

1. 为啥timer还可以用?

var timer;
timer = window.setInterval("Readcadetimer()", 1000);

你定义了一个timer变量,然后将计时器的句柄赋给它(此处的timer变量实际上就是我上面说的handler,是定时器的句柄)。运行至此处则每隔1秒(1000毫秒)运行Readcadetimer()一次。

你在没有将该定时器清除的情况下,又写了一句:

timer = window.setInterval("Readcadetimer()", 1000);

这时候你又创建了一个定时器,然后将句柄赋给了timer,第一个定时器的句柄虽然再也没有索引了,但是它实实在在存在。第二个定时器的作用仍然是每隔1秒(1000毫秒)运行Readcadetimer()一次。

下一句clearInterval(timer);

这句将你创建的第二个计时器给清除了,但是第一个计时器还在运行,所以你觉得好像timer还可以用一样。

2. timer这个数字代表啥意思?

timer没啥意思,他就是一个持有计时器对象的句柄,就相当于你想用你之前创建的计时器的时候,你可以通过timer找到它。


看你的代码需求貌似是想要把Readcadetimer()执行两次然后就结束,这里奉上代码。

请将你Readcadetimer()的定义放在我的代码之前。

var counter = 0,
    handler = setInterval(function()
        counter++;
        if( counter > 2 )
            clearInterval(handler);
            return;
        
        Readcadetimer()
    , 1000);

追问

我那个执行时可能无限次数执行的,
所以我现在这样处理了,
每次创建这个tirmer不管他有没有我都清除一边,这样就没有问题
var timer;
clearInterval(timer);
timer = window.setInterval("Readcadetimer()", 1000);

参考技术A timer其实没什么意思。你可以理解成一个句柄,这个timer仅仅是用来清除延时来用。你可以理解为例如生成实例都有个唯一的gid一样,每次都会产生不同的id,楼主不用纠结这个。
另外你上面的用法有个延时永远没办法清除。因为你的句柄丢失了本回答被提问者采纳
参考技术B var timer1,timer2;
timer1 = window.setInterval("Readcadetimer()", 1000);
timer2 = window.setInterval("Readcadetimer()", 1000);
--清除
clearInterval(timer1);
clearInterval(timer2);

返回值:

返回的值setInterval函数的ID标识,每次调用setInterval函数都会产生一个唯一的ID,可以传递给 Window.clearInterval() 从而取消对 code 的周期性执行。

参考技术C 不是还可以用,是因为你的第一个timer的引用被第二个覆盖了,所以第一个timer是没有清除的
会一直执行

那个数字代表每间隔多少时间执行一次Readcadetimer()这个方法,单位毫秒
参考技术D 用setTimeout函数的时候会有一个返回的id,你可以用一个id记录一个setTimeout。
id = setTimeout("这里写你的函数",1000);
然后当你不用的时候可以clearTimeout(id)释放这个timer。

java基于微信开发,用oauth2静默授权是,回调的url总是执行两次,怎么回事呀?

    用户关注微信公众账号;

    微信公众账号提供用户请求授权页面URL;

    用户点击授权页面URL,将向服务器发起请求;

    服务器询问用户是否同意授权给微信公众账号;

    用户同意(scope为snsapi_base时无此步骤);

    服务器将CODE通过回调传给微信公众账号;

    微信公众账号获得CODE;

    微信公众账号通过CODE向服务器请求Access Token;

    服务器返回Access Token和OpenID给微信公众账号;

    微信公众账号通过Access Token向服务器请求用户信息;

    服务器将用户信息回送给微信公众账号。

参考技术A

@RequestMapping("/oauth")

public String oauth(Integer companyId, Integer model, Double latitude, Double longitude, Integer style,

HttpServletRequest request, HttpServletResponse response, HttpSession session)


if (companyId == 54)

style = 1;

else

style = 0;

try

request.setCharacterEncoding("utf8");

response.setCharacterEncoding("utf8");

catch (Exception e)

e.printStackTrace();

// 获取到code

String code = request.getParameter("code");

System.out.println("获取用户OPENID时的CODE:" + code);

if (StringUtils.isEmpty(code))

System.out.println("获取用户OPENID时的CODE为空!");

return null;

if (StringUtils.isEmpty(longitude) || StringUtils.isEmpty(latitude))

longitude = 0.0;

latitude = 0.0;

// 从session中获取openId信息

String openId = (String) session.getAttribute(companyId + "OPENID");

if (StringUtils.isEmpty(openId))

try

// 根据公司id查询出 token appId appSecret

String appId = null;

String appSecret = null;

CompanyInfo companyInfo = companyInfoService.selectByCompanyId(companyId);

if (!StringUtils.isEmpty(companyInfo))

appId = companyInfo.getAppid();

appSecret = companyInfo.getAppsecret();

// 静默授权

String get_access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?" + "appid=" + appId

+ "&secret=" + appSecret + "&code=CODE&grant_type=authorization_code";

get_access_token_url = get_access_token_url.replace("CODE", code);

JSONObject json = CommonUtil.httpsRequest(get_access_token_url, "GET", null);

if (StringUtils.isEmpty(json))

System.out.println("从微信服务器新获取的用户OPENID,返回JSON信息为空");

return null;

JSONObject jsonObject = JSONObject.fromObject(json);

try

openId = jsonObject.getString("openid");

session.setAttribute(companyId + "OPENID", openId);// 放入session

System.out.println("新获取的用户OPENID:" + openId);

return "redirect:fitnessService.do?companyId=" + companyId + "&model=" + model + "&openId=" + openId

+ "&latitude=" + latitude + "&longitude=" + longitude + "&style=" + style;

catch (Exception e)

System.out.println("返回JSON信息中获取用户OPENID失败异常");

return null;

catch (Exception e)

e.printStackTrace();

return null;

else

System.out.println("SESSION中的OPENID:" + openId);

return "redirect:fitnessService.do?companyId=" + companyId + "&model=" + model + "&openId=" + openId

+ "&latitude=" + latitude + "&longitude=" + longitude + "&style=" + style;

看看代码思路即可  openID可以缓存  自己研究下吧  

参考技术B 微信访问你的回调地址,你必须给它返回个“SUCCESS”字符串,不然他就会认为你没有接收到信息 参考技术C 我这里也是,请问您解决了么? 参考技术D 微信公众平台OAuth2.0授权详细步骤如下:
1. 用户关注微信公众账号。
2. 微信公众账号提供用户请求授权页面URL。
3. 用户点击授权页面URL,将向服务器发起请求
4. 服务器询问用户是否同意授权给微信公众账号(scope为snsapi_base时无此步骤)
5. 用户同意(scope为snsapi_base时无此步骤)
6. 服务器将CODE通过回调传给微信公众账号
7. 微信公众账号获得CODE
8. 微信公众账号通过CODE向服务器请求Access Token
9. 服务器返回Access Token和OpenID给微信公众账号
10. 微信公众账号通过Access Token向服务器请求用户信息(scope为snsapi_base时无此步骤)
11. 服务器将用户信息回送给微信公众账号(scope为snsapi_base时无此步骤)

以上是关于js timer启动两次怎么停止呀?的主要内容,如果未能解决你的问题,请参考以下文章

C# Timer.Elapsed 事件连续触发两次

java基于微信开发,用oauth2静默授权是,回调的url总是执行两次,怎么回事呀?

标签显示两次Swift

Console.log 在 Vue js watcher 中被调用两次

即使使用 launchMode="singleTask" 也可以启动两次活动

如何解决被触发两次的点击事件?