Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
了解与setTimeout和setInterval一起使用的javascript承诺_Javascript_Promise - Fatal编程技术网

了解与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秒运行一次异步函数”?