場景:
做直播,會有入場訊息,入場特效,使用者如果有坐騎,需要給他展示幾秒鐘的坐騎特效,如果幾個人同時進場,那該怎麼展示呢?這時候就會想到settimeout函式,對,思路不錯,但是,非同步函式佇列怎麼實現呢?直接上**:
var queue =function() ;queue.prototype =,
wait: function(ms) ,
dequeue: function() ;
if (typeof el == "
number
") , el);
} else
if (typeof el == "
function
")
else}}
};
例子:如果a,b差不多同時進來;
c在a,b還沒完全出佇列的時候,進來的;
d在a,b,c都除了佇列之後再進來的。
var q = newqueue();
function
a()
function
b()
function
c()
function
d()
q.wait(2000);
q.queue(a);
q.wait(2000);
q.queue(b);
q.dequeue();
settimeout(
function(),3000);
settimeout(
function(),8000);
這裡我們就需要判斷什麼時候要呼叫dequeue來出佇列了。(為什麼c進佇列的時候,不需要dequeue,但是d進來的時候就需要dequeue了呢?)
但是一般我們是無法知道使用者什麼時候進場的,一般都是進佇列了,就該能出佇列,但是如果使用者是在空佇列的時候進來的,之前的遞迴呼叫dequeue就執行完了,你進來需要再執行 出佇列的操作。
於是,**應該這樣:
var q = newqueue();
function
a()
function
b()
function
c()
function
d()
q.wait(2000);
q.queue(a);
if (!q.isdequeue)
q.wait(2000);
q.queue(b);
if (!q.isdequeue)
settimeout(
function()
}, 3000);
settimeout(
function()
}, 8000);
這樣,每進一次佇列,就判斷要不要出佇列,事情就ok了。
JS非同步之巨集佇列與微佇列
js 中用來儲存待執行 函式的佇列包含 2 個不同特定的列隊 js 執行時會區別這 2 個佇列 下面這個例子可以看出promise要先於settimeout執行 settimeout 0 settimeout 0 promise.resolve 1 then value 0 promise.reso...
js 事件迴圈,非同步,事件佇列
首先,現附上我查詢資料中用到較好的一張圖 這裡面就對事件迴圈,任務佇列,非同步操作介紹的很詳細.我的理解 較為粗略的一張圖 我認為的事件迴圈的主要邏輯 1.取乙個巨集任務來執行,執行完畢,下一步.2.取乙個微任務來執行,執行完畢,再取乙個微任務來執行,直到微任務全部取完.3.更新ui渲染 概念 巨集...
JS非同步機制
js非同步機制 主線程不斷讀取執行棧中的同步事件,直到執行棧空 非同步任務結束放入任務佇列,執行棧空時主線程讀取任務佇列 任務佇列讀取完畢,回到步驟1 巨集任務與微任務 巨集任務 script 整體 settimeout setinterval ui 渲染 i o postmessage messa...