我正在嘗試創建一個顯示數字 1 到 10 并延遲列印每個數字的函式。比如 1 秒后列印 1,2 秒后列印 2 最多 10 個。還必須在數字列印之前和之后列印開始和結束。
嘗試創建一個 Promise 并使用 async await 來實作這一點。但是無法在函式后正確列印“結束”。
當試圖解決承諾時,它會在 settimout 操作之前得到解決。
async function disp(){
console.log("start")
await promise();
console.log("end")
}
function promise(){
return new Promise((resolve, reject) => {
for(let i=1;i<10;i ){
setTimeout(() => {
console.log(i);
}, i*1000);
}
//resolve();
})
}
disp();
uj5u.com熱心網友回復:
Promise 沒有解決,即它既不會resolving也rejecting不會停留在pending狀態。您所要做的就是在i達到最終計數后兌現承諾
async function disp() {
console.log('start');
await promise();
console.log('end');
}
function promise() {
return new Promise((resolve, reject) => {
const upto = 10;
for (let i = 1; i <= upto; i ) {
setTimeout(() => {
console.log(i);
if (i === upto) resolve(); // CHANGE
}, i * 1000);
}
});
}
disp();
uj5u.com熱心網友回復:
一個更清潔的解決方案是實作一個wait功能。然后你可以撰寫更易讀的代碼。
const wait = async ms => new Promise(resolve => setTimeout(resolve, ms));
async function disp() {
console.log("start");
await count(10);
console.log("end");
}
async function count(n) {
for (let i = 1; i <= n; i ) {
await wait(1000);
console.log(i);
}
}
disp();
uj5u.com熱心網友回復:
或者,使用更少的函式,@gre_gor 的解決方案將如下所示:
async function disp(n) {
console.log("start")
for (let i = 1; i <= n; i ) {
await new Promise(resolve => setTimeout(resolve, 1000));
console.log(i);
}
console.log("end")
}
disp(10);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/513479.html
標籤:javascript异步
