相关疑难解决方法(0)

为什么 setTimeout 需要匿名函数才能工作?

我读StackOverflow上的答案在这里解释了如何使用的setTimeout来创造一种在网页上反复循环。但是,我想知道为什么 setTimeout 需要匿名函数才能工作。考虑以下代码:

trainingTimer(60,0);

function trainingTimer(duration,c) {
    document.getElementById("timer").innerHTML = "Time left: "+(duration-c);
    if(duration==c) {
        alert("Time is up!");
    }
    else {
        window.setTimeout(trainingTimer(duration,c+1),1000);
    }
}
Run Code Online (Sandbox Code Playgroud)

我是根据上面链接的答案写的,但是当它运行时,它会trainingTimer一次遍历所有 60 个调用,并立即在我的网页上显示“剩余时间:0”。但是,如果我修改

window.setTimeout(trainingTimer(duration,c+1),1000);

trainingTimer(duration,c+1)像这样包装一个匿名函数

window.setTimeout(function() {trainingTimer(duration,c+1)},1000);

那么代码工作得很好。

我想知道为什么我必须将命名函数包装在匿名函数中才能使 setInterval 正常工作。感谢所有的帮助。

javascript setinterval

1
推荐指数
1
解决办法
746
查看次数

setTimeout 函数的第三个参数是什么?

我正在阅读一些使用 Promise 对象的代码。

有一个setTimeout带有三个参数的函数,我想知道第三个参数是做什么的?因为通常它只有两个参数。

代码如下:

function timeout(ms) {
    return new Promise((resolve, reject) => {
        setTimeout(resolve, ms , 'done');
    });
}
timeout(1000).then(value => {
    console.log(value);
});
Run Code Online (Sandbox Code Playgroud)

我注意到第三个参数被传递给了函数resolve,但是为什么我可以在函数中使用它then?它是如何工作的?

javascript es6-promise

1
推荐指数
1
解决办法
2937
查看次数

使用setTimeout - 如何传递参数?

我正在尝试开发幻灯片,幻灯片之间有暂停.所以我正在尝试使用setTimeout语句,如下所示.这是写入交换2.jpg为1.jpg,点击按钮暂停10秒.但现在确实有效.谁能帮我.谢谢.

<html>
<head>
<script type="text/javascript">
var t;
function swap(newImage) {
  var fileName=newImage.toString()+".jpg"
  document.slideshow.src=fileName
  t=setTimeout("swap()",10000)
}
</script>
</head>  
<body> 
  <img name="slideshow" src="1.jpg" width="450" height="335" />
  <br /><br />
  <input type="button" onClick="swap('2')" value="Change image" /> 
  <br /><br />
</body>
</html> 
Run Code Online (Sandbox Code Playgroud)

javascript settimeout

0
推荐指数
1
解决办法
5026
查看次数

javascript变量在函数内部丢失

我在谷歌地图代码中处理这个问题,但它实际上是一个架构问题.在某些时候因为这么多的请求谷歌地图限制了响应,并且在那一点上我想要延迟做另一个请求,但是当我再次调用function2时它说"数组未定义".

function1() {
    var array = JSON.parse(xmlhttp.responseText);

    for (i; i < length; < i++) {
        function2(array[i].one, array[i].two);
    }

    function3() {
        //render directions
    }

    function2(start, end) {
        directionsService.route({
            origin: start,
            destination: end,
        },

        function (result, status) {
            if (status == google.maps.DirectionsStatus.OK)
                function3(result);
            else if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT)
                var functionStr = "function2(array[i].one" + ',' + "array[i].two)";
            setTimeout(functionStr, 5000);
        });
    }

}
Run Code Online (Sandbox Code Playgroud)

javascript google-maps google-maps-api-3

0
推荐指数
1
解决办法
212
查看次数

在同一个函数中调用`Function` vs`Function()`

我正在编写一个长轮询脚本并遇到一个too much recursion挂起浏览器的错误.我的目标是每1000ms使用相同的功能setTimeout().是的,我可以使用,setInterval()但它将是一个长轮询脚本,并将等待服务器响应.

我通过删除()我在同一个函数中调用的函数来解决这个问题.

我的脚本看起来像:

function messagePolling(){
    console.log("polled")
    setTimeout(messagePolling(),1000) // <--- removing `()` from the function works as intended 
} 

messagePolling();
Run Code Online (Sandbox Code Playgroud)

这背后的逻辑是什么?messagePolling毕竟不是它的功能.

javascript jquery

0
推荐指数
1
解决办法
73
查看次数

为什么 setTimeout 是同步执行的?

setTimeout下面是同步代码之后执行的例子

console.log('hello');
setTimeout(() => console.log('timeout'), 0);
console.log('end');
Run Code Online (Sandbox Code Playgroud)

控制台输出:hello end timeout

异步:

function asyncForEach(array, callBack) {
    array.forEach(x => setTimeout(callBack(x), 0));
}
asyncForEach([1,2,3,4], (i) => console.log(i)); 
console.log('end');
Run Code Online (Sandbox Code Playgroud)

控制台输出:

1
2
3
4
end
Run Code Online (Sandbox Code Playgroud)

同步:

[1,2,3,4].forEach(x => console.log(x));
console.log('end');
Run Code Online (Sandbox Code Playgroud)

控制台输出:

1
2
3
4
end
Run Code Online (Sandbox Code Playgroud)

我试图更好地理解event looptask queue,并且在观看了一个很好的推荐视频(https://www.youtube.com/watch?v=8aGhZQkoFbQ)后,遇到了以下半声明:“回调可以是同步和异步的”。演讲者继续演示同步方式如何最终不会通过task queue,因此不会通过event loop,因此所有内容都保留在stack. 但是,异步方式会导致task queue用 的最终返回填充setTimeout callback,这将使任何同步的下面代码可执行,因为event loop必须等待一个空stack来插入返回的callback.

运行上面的代码时(我从他那里偷来的东西也编辑过,所以这可能是我的错误添加),异步方式产生与同步方式相同的结果。

有人可以帮助解释为什么异步方式不作为第一个setTimeout示例和/或提供解释如何不将常规回调(例如数组帮助程序方法)插入task …

javascript event-loop task-queue

0
推荐指数
1
解决办法
100
查看次数

带有变量传递的变量的setTimeout

在java脚本中执行某些功能之前我需要延迟.我可以使用setTimeout,但问题是我有两个传递给函数的变量.在这种情况下我需要setTimeout的语法.任何人都可以帮忙吗?

javascript

-3
推荐指数
1
解决办法
53
查看次数