下面代码怎么分别使用Promise和async改写成每隔1s打印1个数字的形式?
分别使用Promise和async改写成每隔1s打印1个数字的形式
function print(n){ for(var i = 0;i <n;i++){
setTimeout(console.log, 1000, i);
}
}
print(10);
回答:
async/await:
const sleep = t => new Promise(res => setTimeout(res, t))const print = async n => {
for (let i = 0; i < n; i ++) {
console.log(i)
await sleep(1000)
}
}
纯 Promise(有必要吗?)
const print = n => Array(n).fill().reduce((p, _, i) => p.then(() => new Promise(res => { console.log(i)
setTimeout(res, 1000)
}, Promise.resolve())
也不用 Promise
const print = (n, i = 0) => { if (i === n) return
console.log(i)
setTimeout(() => print(n, i + 1), 1000)
}
回答:
改造 setTimeout
const asyncSetTimeout = (timeout = 1e3, ...params) => { let timer = 0;
let rejectRef = null;
const result = new Promise((resolve, reject) => {
rejectRef = reject;
timer = setTimeout(() => {
resolve(params);
}, timeout);
});
result.cancelTimeout = (reason) => {
clearTimeout(timer);
rejectRef(reason);
};
return result
};
Promise 版本
const print = (times, curTime = 0) => { asyncSetTimeout().then(() => {
console.log(curTime);
times && print(times - 1, curTime + 1);
})
}
async-await 版本
const print = async (times, curTime = 0) => { await asyncSetTimeout(1e3);
console.log(curTime);
times && print(times - 1, curTime + 1);
}
以上是 下面代码怎么分别使用Promise和async改写成每隔1s打印1个数字的形式? 的全部内容, 来源链接: utcz.com/p/933604.html