【发布时间】:2018-05-01 11:31:32
【问题描述】:
代码 1
console.log('start');
const interval = setInterval(() => {
console.log('setInterval');
}, 0);
setTimeout(() => {
console.log('setTimeout 1');
Promise.resolve()
.then(() => {
console.log('promise 3');
})
.then(() => {
console.log('promise 4');
})
.then(() => {
setTimeout(() => {
console.log('setTimeout 2');
Promise.resolve()
.then(() => {
console.log('promise 5');
})
.then(() => {
console.log('promise 6');
})
.then(() => {
clearInterval(interval);
});
}, 0);
});
}, 0);
Promise.resolve()
.then(() => {
console.log('promise 1');
})
.then(() => {
console.log('promise 2');
});
此代码在Windows Edge/Mac Safari/Opera 浏览器上的结果如下:
start
promise 1
promise 2
setInterval
setTimeout 1
promise 3
promise 4
setInterval
setTimeout 2
promise 5
promise 6
但是当在 Windows 或 Mac 上的 chrome 上运行时,结果有两种情况。
有时结果与上述相同。
有时结果会输出两个setInterval,如下:
start
promise 1
promise 2
setInterval
setTimeout 1
promise 3
promise 4
setInterval
setInterval
setTimeout 2
promise 5
promise 6
我对结果感到困惑。
代码 2
function expendTime(k){
console.log((new Date()).getTime());
while(k < 10000){
for(var j = 2; j < k; j++){
if(k%j == 0){
break;
}
if(j == k-1){
console.log(k)
}
}
k++;
}
console.log((new Date()).getTime());
}
var t = setInterval(expendTime,15,3);
setTimeout(function() {
clearInterval(t);
},30);
.as-console-wrapper {
max-height: 100% !important;
}
这段代码在chrome和其他浏览器上运行的结果是不同的。
我认为在其他浏览器上的结果是正确的,因为它符合我的常识。
【问题讨论】:
-
欢迎来到 Stack Overflow!寻求帮助时,请花时间以一致、易读的方式格式化和缩进您的代码。 (在不寻求帮助时也是个好主意。)这次我已经为你做了。
-
您是否假设零间隔会使其同步?如果你是,情况并非如此。
-
Re "Code 2": “这段代码在 chrome 和其他浏览器上运行时的结果是不同的。” 您在每种情况下看到了什么?你认为什么是常识版本?
-
我猜所有其他库都使用某种递归
setTimeout来模拟setInterval而 Chrome 使用其他东西(如果这种行为真的可以重现的话)
标签: javascript