了解与setTimeout和setInterval一起使用的javascript承诺
有人能帮我理解这两行代码并改进它们,让我真正停止重复吗了解与setTimeout和setInterval一起使用的javascript承诺,javascript,promise,Javascript,Promise,有人能帮我理解这两行代码并改进它们,让我真正停止重复吗 var wait = ms => new Promise(r => setTimeout(r, ms)); var repeat = (ms, func) => new Promise(r => (setInterval(func, ms), wait(ms).then(r))); repeat(1000, () => Promise.all([myfunction()]) .then(...) 您可以
var wait = ms => new Promise(r => setTimeout(r, ms));
var repeat = (ms, func) => new Promise(r => (setInterval(func, ms), wait(ms).then(r)));
repeat(1000, () => Promise.all([myfunction()])
.then(...)
您可以在
repeat
中完成wait
后解析从setInterval
返回的间隔,并使用clearInterval
清除间隔:
var wait=(ms)=>newpromise((resolve)=>setTimeout(resolve,ms));
var repeat=(ms,func)=>新承诺((解析)=>{
常数间隔=设置间隔(func,ms);
等待(毫秒),然后(()=>解析(间隔));
});
重复(1000,()=>console.log(“重复”))
.然后((间隔)=>{
控制台日志(“停止重复”);
间隔时间;
});代码>第一行(等待)只是等待一定的毫秒数,然后结束
第二行(repeat)编程一个函数,使其在一定的时间间隔(setInterval)内运行,然后调用wait并将repeat函数上设置的毫秒数传递给它。这些函数只调用一次。Javascript对setInterval的内部控制是从现在开始在编程的时间间隔内调用()=>Promise.all([myfunction()])
的控制
如果你只是识别你的代码,事情就会变得更清楚
var wait =
ms => new Promise(
r => setTimeout(r, ms)
);
var repeat =
(ms, func) => new Promise(
r => (
setInterval(func, ms),
wait(ms).then(r)
)
);
repeat(1000, () => Promise.all([myfunction()]))
.then(...);
如SimpleJ所指出的,为了停止函数,必须捕获间隔的id并调用clearInterval。
一旦你全力以赴,你可能会希望通过承诺来实现这一点。因此,一个完整的工作示例是:
var intervalID = 0;
var wait =
ms => new Promise(
r => setTimeout(r, ms)
);
var repeat =
(ms, func) => new Promise(
r => (
intervalID = setInterval(func, ms),
wait(ms).then(r)
)
);
var myfunction =
() => new Promise(
r => r(console.log('repeating...'))
);
var stopAfter5Secs =
() => new Promise(
r => r(setTimeout(() => {
clearInterval(intervalID);
console.log('repeat end')
} , 5000))
);
repeat(1000, () => Promise.all([myfunction()])) // 1000 miliseconds = 1 second
.then(stopAfter5Secs()) // starts timer to end repetitions
.then(console.log('repeat start')); // informs that all actions were started correctly and we are waiting for them to finish
all调用传递给它的任何可交互对象中的所有Promiss。在本例中,数组只有一个元素(myfunction)。我创建了一个简单的函数,该函数只向控制台写入“repeating”。但如果所有函数都返回期票,则可以将任意数量的函数传递给它
您可以看到它在这里工作:用“经典”ES表示法写出它们,用函数(输入){doAthing}
替换箭头表示法input=>doAthing
,然后看看您是否理解它的功能。这是一种异步轮询吗?比如“每n秒运行一次异步函数”?