如果我想使用setTimeout和delay = Math.random() * 1000
打印1到10之间的数字。
由于异步编程和事件循环,答案将以随机顺序从1到10进行编号。
我想要的是按照上面提到的相同延迟以递增顺序打印数字。这可以通过Promises或Async模块完成。我的意思是它应该只在打印1号后继续进行,然后再打印等等。
任何帮助都将不胜感激。
注意:请不要给出一些答案,例如为变量添加时间并将该变量用作延迟。
答案 0 :(得分:2)
您可以使用Promises和async/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;
实际打印数字的函数是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
这样
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;
无需在此处添加额外的逻辑和代码。
答案 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);