Web Locks API
åºçº¿
广æ³å¯ç¨
èª 2022å¹´3æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
å®å ¨ä¸ä¸æ: æ¤ç¹æ§ä» å¨ä¸äºæ¯æçæµè§å¨çå®å ¨ä¸ä¸æï¼HTTPSï¼ä¸å¯ç¨ã
夿³¨ï¼ æ¤ç¹æ§å¨ Web Worker ä¸å¯ç¨ã
Web Locks API å 许å¨ä¸ä¸ªæ ç¾é¡µæ worker ä¸è¿è¡çèæ¬å¼æ¥è·åéï¼å¨æ§è¡å·¥ä½æ¶ææéï¼æåéæ¾éãææéæ¶ï¼å¨å䏿ºä¸æ§è¡çå ¶ä»èæ¬é½æ æ³è·åç¸åçéï¼è¿å 许å¨å¤ä¸ªæ ç¾é¡µæ worker ä¸è¿è¡ç Web åºç¨ç¨åºåè°å·¥ä½åèµæºç使ç¨ã
æ¦å¿µåç¨æ³
鿝ä¸ä¸ªæ½è±¡æ¦å¿µï¼ä»£è¡¨ä¸äºæ½å¨çå ±äº«èµæºï¼ç± Web åºç¨ç¨åºéæ©çåç§°è¿è¡æ è¯ãä¾å¦ï¼å¦æå¨å¤ä¸ªæ ç¾é¡µä¸è¿è¡ç Web åºç¨ç¨åºæ³è¦ç¡®ä¿åªæä¸ä¸ªæ ç¾é¡µå¨ç½ç»åç´¢å¼æ°æ®åºä¹é´åæ¥æ°æ®ï¼åæ¯ä¸ªæ ç¾é¡µé½å¯ä»¥å°è¯è·åâmy_net_db_syncâéï¼ä½åªæä¸ä¸ªæ ç¾é¡µä¼æåï¼é¢å¯¼è é举模å¼ï¼ã
API ç¨æ³å¦ä¸ï¼
- 请æ±éã
- å¨å¼æ¥ä»»å¡ä¸ææéç忶宿工ä½ã
- ä»»å¡å®æåéèªå¨éæ¾ã
navigator.locks.request("my_resource", async (lock) => {
// é已被è·åã
await do_something();
await do_something_else();
// ç°å¨éå°è¢«éæ¾ã
});
彿æéæ¶ï¼æ¥èªæ¤æ§è¡ä¸ä¸ææå ¶ä»æ ç¾é¡µä»¥å Worker è¿ç¨çç¸åéç请æ±å°æéãä» å½éè¢«éæ¾æ¶ï¼ç¬¬ä¸ä¸ªæéçè¯·æ±æä¼è¢«æäºéã
API æä¾äºå¯æ ¹æ®éè¦ä½¿ç¨çå¯éåè½ï¼å æ¬ï¼
- ä»å¼æ¥ä»»å¡è¿åå¼
- å ±äº«éåç¬å 鿍¡å¼
- æ¡ä»¶è·å
- è¯æä»¥æ¥è¯¢æºä¸éçç¶æ
- 鲿¢æ»éçåºæ¥éé
éçèå´ä»
éäºåä¸ä¸ªæºå
ï¼ä¸ä¸ªæ ç¾é¡µä» https://example.com è·åçé对å¦ä¸ä¸ªæ ç¾é¡µä» https://example.org:8080 è·åçéæ²¡æå½±åï¼å 为å®ä»¬æ¯ä¸åçæºã
主è¦å
¥å£ç¹æ¯è¯·æ±éç navigator.locks.request() æ¹æ³ãå®éè¦ä¸ä¸ªéçåç§°ãä¸ç»å¯éé项åä¸ä¸ªåè°æ¹æ³ãæäºéæ¶å°è°ç¨åè°æ¹æ³ãå½åè°æ¹æ³è¿åæ¶ï¼éä¼èªå¨éæ¾ï¼å æ¤é常åè°æ¯ä¸ä¸ªå¼æ¥å½æ°ï¼è¿ä¼å¯¼è´åªæå½å¼æ¥å½æ°å®å
¨å®ææ¶æä¼éæ¾éã
request() æ¹æ³æ¬èº«è¿åä¸ä¸ª Promiseï¼ä¸æ¦éè¢«éæ¾ï¼è¯¥ Promise å°±ä¼å
ç°ï¼å¨ async 彿°ä¸ï¼èæ¬å¯ä»¥ä½¿ç¨ await å
³é®åçå¾
è°ç¨ä»¥ä½¿å¼æ¥ä»£ç 线æ§è°ç¨ãä¾å¦ï¼
await do_something_without_lock();
// 请æ±éã
await navigator.locks.request("my_resource", async (lock) => {
// é已被è·åã
await do_something_with_lock();
await do_something_else_with_lock();
// ç°å¨éå°è¢«éæ¾ã
});
// éå·²è¢«éæ¾ã
await do_something_else_without_lock();
é项
请æ±éæ¶å¯ä»¥ä¼ éä¸äºé项ï¼
modeï¼é»è®¤æ¨¡å¼ä¸ºâç¬å âï¼"exclusive"ï¼ï¼ä½å¯ä»¥æå®ä¸ºâå ±äº«âï¼"shared"ï¼æ¨¡å¼ãéåªè½æä¸ä¸ªâç¬å âææè ï¼ä½å¯ä»¥åæ¶æäºå¤ä¸ªâå ±äº«â请æ±ãè¿å¯ç¨äºå®ç°è¯»è ââåè æ¨¡å¼ãifAvailableï¼å¦ææå®ï¼å¦æä¸çå¾ å°±æ æ³ç«å³æäºéå®ï¼åéå®è¯·æ±å°å¤±è´¥ã使ç¨nullè°ç¨åè°æ¹æ³ãstealï¼å¦ææå®ï¼åå°éæ¾ä»»ä½ææçååéï¼å¹¶ä¸è¯·æ±å°è¢«æäºï¼æ¢å 任使éç请æ±ãsignalï¼å¯ä»¥ä¼ å ¥ä¸ä¸ªAbortSignalï¼å è®¸ä¸æ¢éå®è¯·æ±ãè¿å¯ç¨äºå®ç°è¯·æ±è¶ æ¶ã
çæ§
èæ¬å¯ä»¥ä½¿ç¨ navigator.locks.query() æ¹æ³æ¥å
çæºé管çå¨çç¶æãè¿å¨è°è¯æ¶é常æç¨ï¼ä¾å¦ï¼ç¡®å®æ æ³è·åéçåå ãç»ææ¯ä¸ä¸ªé管çå¨ç¶æçå¿«ç
§ï¼å®æ è¯äºææå¿«ç
§æ¶ææçéå请æ±ä¸çé以åæå
³æ¯ä¸ªéçä¸äºéå æ°æ®ï¼ä¾å¦æ¨¡å¼ï¼ã
è¿é¶ç¨æ³
å¯¹äºæ´å¤æçæ åµï¼ä¾å¦å¨ä»»ææ¶é´å ææéï¼åè°å¯ä»¥è¿åä¸ä¸ªèæ¬æ¾å¼è§£å³ç Promiseï¼
// æè· Promise æ§å¶å½æ°ï¼
const { promise, resolve, reject } = Promise.withResolvers();
// 请æ±éï¼
navigator.locks.request(
"my_resource",
// é已被è·åã
(lock) => promise, // ç°å¨éå°è¢«ææç´å°è°ç¨ resolve() æ¹æ³æ reject() æ¹æ³ä¸ºæ¢ã
);
æ»é
å½è¿ç¨çæ¯ä¸ªé¨åé½å¨çå¾ æ æ³æ»¡è¶³ç请æ±èæ æ³ååå¾è¿å±æ¶ï¼å°±ä¼åçæ»éãæ¤ API å¯è½ä¼å¨å¤æçç¨ä¾ä¸åçè¿ç§æ åµï¼ä¾å¦ï¼å¦ææ åºè¯·æ±å¤ä¸ªéã妿æ ç¾é¡µ 1 ææé A 并䏿 ç¾é¡µ 2 ææé Bï¼æ¥çæ ç¾é¡µ 1 ä¹å°è¯è·åé Bï¼èæ ç¾é¡µ 2 ä¹å°è¯è·åé Aï¼å两个请æ±é½ä¸ä¼è¢«æäºéãWeb åºç¨ç¨åºå¯ä»¥éè¿å¤ç§çç¥æ¥é¿å è¿ç§æ åµï¼ä¾å¦ç¡®ä¿éå®è¯·æ±ä¸åµå¥ãå§ç»æåºæè®¾å®è¶ æ¶ã请注æï¼æ¤ç±»æ»éä» å½±åéæ¬èº«åä¾èµäºå®ä»¬ç代ç ï¼æµè§å¨ãå ¶ä»æ ç¾é¡µå页é¢ä¸çå ¶ä»èæ¬ä¸åå½±åã
æ¥å£
Lock-
æä¾å å请æ±çéçåç§°åæ¨¡å¼ï¼è¯¥éä¼è¢«ä¼ å ¥
LockManager.request()çåè°æ¹æ³æ¥æ¶ã LockManager-
æä¾è¯·æ±æ°ç
Lockå¯¹è±¡åæ¥è¯¢ç°æLockå¯¹è±¡çæ¹æ³ãè¦è·åLockManagerçå®ä¾ï¼è¯·è®¿é®navigator.locksã
å ¶ä»æ¥å£çæ©å±
-
è¿åä¸ä¸ª
LockManager对象ï¼è¯¥å¯¹è±¡æä¾è¯·æ±æ°çLockå¯¹è±¡åæ¥è¯¢ç°æLockå¯¹è±¡çæ¹æ³ã -
è¿åä¸ä¸ª
LockManager对象ï¼è¯¥å¯¹è±¡æä¾è¯·æ±æ°çLockå¯¹è±¡åæ¥è¯¢ç°æLockå¯¹è±¡çæ¹æ³ã
è§è
| è§è |
|---|
| Web Locks API > |