如何使用async或promises使用setTimeout添加随机延迟

时间:2017-07-10 10:44:39

标签: javascript asynchronous settimeout es6-promise

如果我想使用setTimeout和delay = Math.random() * 1000打印1到10之间的数字。 由于异步编程和事件循环,答案将以随机顺序从1到10进行编号。

我想要的是按照上面提到的相同延迟以递增顺序打印数字。这可以通过Promises或Async模块完成。我的意思是它应该只在打印1号后继续进行,然后再打印等等。

任何帮助都将不胜感激。

注意:请不要给出一些答案,例如为变量添加时间并将该变量用作延迟。

4 个答案:

答案 0 :(得分:2)

您可以使用Promisesasync/await

这样做



// returns a promise that resolves after the specified number of ms
function delay(ms) {
    return new Promise(resolve => {
        setTimeout(resolve, ms);
    });
}

// function that will print the numbers in correct order, with delays
async function print(num) {
    for (let i = 1; i <= num; i++) {

        await delay(Math.random() * 1000); // wait 

        console.log(i); // print number
    }
}

print(10); // actually execute function
&#13;
&#13;
&#13;

实际打印数字的函数是async函数,使用基于在指定的毫秒数后解析的promise的延迟。

答案 1 :(得分:0)

我想你想要一个半递归 setTimeout:

(function print(value){
   console.log(value);
   if(value<10) setTimeout(print,Math.random()*1000,value+1);
})(1);

答案 2 :(得分:0)

您需要使用setInterval而不是setTimeout这样

&#13;
&#13;
var count = 1;

var printSequence;
function myFunction() { 
    //using setInterval that is referenced by a variable
    printSequence = setInterval(print, Math.random()*1000);
    
}

function print(){
      console.log(count);
      count++;;
      clearInterval(printSequence);
      
      if(count <= 10){
         myFunction();
      }      
}
&#13;
<button onclick="myFunction()">Try it</button>
&#13;
&#13;
&#13;

无需在此处添加额外的逻辑和代码。

答案 3 :(得分:0)

es6 fromat

const delay = (m) => new Promise(resolve => setTimeout(resolve, m));

const print = async (num) => { 
     for (let i = 1; i <= num; i++) {
         await delay(Math.random() * 1000);
         console.log(i);
     }  
};
 
print(10);