js 時間等待 - daniel-qa/Vue GitHub Wiki
js 時間等待
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
await sleep(3000); // 等待 3 秒
說明:
1 (ms):
ms 是一個參數,代表延遲的時間,單位是毫秒(1 秒 = 1000 毫秒)。當呼叫 sleep 函式時,會傳入這個數值來控制延遲時間。
new Promise(resolve => setTimeout(resolve, ms)):
2 new Promise():創建了一個新的 Promise 物件,Promise 是 JavaScript 中用來處理異步操作的機制。
setTimeout(resolve, ms):setTimeout 是 JavaScript 的一個定時器函式,用來設置延遲執行的動作。這裡它的作用是:
resolve 是 Promise 物件的解析方法(也可以理解為 "完成" 的操作)。
ms 是延遲的時間,告訴 setTimeout 等待多少毫秒後呼叫 resolve,表示延遲完成。
3 resolve:
當 setTimeout 計時完成後,resolve() 會被呼叫,並讓 Promise 變成「已解決」狀態,表示延遲已經結束。
簡單來說:
sleep 函式會返回一個 Promise,它會在 ms 毫秒後自動解決,實現等待的效果。 在 async 函式中搭配 await 使用,會暫停程式執行,直到延遲結束。 例如:
await sleep(3000); // 這行會讓程式等待 3 秒
這樣的設計讓程式能夠在需要等待的地方「停頓」一段時間,並且能在這段時間過後繼續執行後續的操作。
P.S Promise 物件
Promise 是 JavaScript 中用來處理異步操作的一種機制。它代表了一個尚未完成但將來會完成的操作,並且提供了一種方法來註冊當操作完成時該做什麼。
- 基本概念:
Promise 可以處於三種狀態之一:
Pending(待定):初始狀態,表示操作還在進行中,尚未完成。
Resolved/Fulfilled(已完成):操作成功完成,並且給出一個結果(返回值)。
Rejected(已拒絕):操作失敗,並且給出錯誤原因。
這三種狀態是 Promise 的生命週期,並且 Promise 可以從一個狀態轉變到另一個狀態。
下面是概念說明
for (let i = 1; i <= 5; i++) {
setTimeout(() => console.log(`#${i}`), 1000);
}
在上面的代码中,我们想实现的是,我们想每隔1秒记录一次数值i,直到for循环条件为假。
但是当你运行这段代码时,这不会发生。相反,执行将暂停1秒,然后一次打印5个值。
嗯,这不是应该发生的。我们需要每隔1秒记录一次数值,而不是等待1秒后同时记录所有的数值。
嗯,这就是JavaScript的工作方式。它按照自己的规则工作。所以,举例来说,setTimeout(1000)的工作方式并不像在你调用console.log()函数之间等待1秒那样。
请看输出。
#1
#2
#3
#4
#5
这导致所有五条控制台日志信息在单次延迟1秒后一起显示,而不是每次重复调用之间延迟1秒的理想效果
这是因为setTimeout()函数是作为同步代码执行的,对setTimeout()的多个函数调用都是同时进行的。
因此,对setTimeout()的每次调用都会创建一个异步代码,该代码将在稍后执行,经过一定的延迟。由于代码片段中的每个延迟都是一样的(1000ms或1秒),所有排队的代码都同时运行,在单一的1秒延迟之后。
正如所讨论的,setTimeout()不是一个sleep()函数;相反,它只是将异步代码排入队列,供以后执行。 但幸运的是,在JavaScript中可以使用setTimeout()来创建你自己的sleep()函数。
JavaScript的Wait
为了让你的JavaScript代码Wait,使用Promises、async/await和setTimeout() 函数的组合,通过它你可以写出等待函数,它将按照你的期望工作。然而,你只能在async函数中调用这个自定义的wait()函数,而且你需要在其中使用await关键字。
JavaScript中的wait()例子
创建一个名为app.js 的新文件,在该文件中写下以下代码。
const list = [1, 2, 3, 4]
const task = async () => {
for (const item of list) {
await new Promise(r => setTimeout(r, 1000));
console.log('Yello, D\'oh');
}
}
task();
输出
rust 代码解读复制代码node app
Yello, D'oh
Yello, D'oh
Yello, D'oh
Yello, D'oh
在这里,我们使用这只是一行代码,它将为我们等待。
await new Promise(r => setTimeout(r, 1000));
这段代码的工作原理与你可能预期的完全一样,因为await会使代码的同步执行暂停,直到Promise被解决。
总结
JavaScript可能没有睡眠或等待函数,但只要你对代码和使用方法非常小心,就可以很容易地使用内置的setTimeout()函数创建一个函数或编写一行代码。
就其本身而言,setTimeout()函数不能作为sleep()方法使用,但你可以使用async和await创建一个自定义的JavaScriptWait()函数。