實現乙個lazyman

2021-10-04 20:48:25 字數 3076 閱讀 4664

實現乙個lazyman:

輸出:

睡了一分鐘

我的名字叫tom

吃了個蘋果

喝了點水

睡了一分鐘

吃了奧利給

我們現在先拋開題目本身,將核心功能抽離出來,假設現在有三個活動

leta=

function()

letb

=function()

,0)}

letc

=function()

我們依次執行他們:

a()

b()c

()

最後輸出:132

對於上述三個活動,我要實現他們的順序執行,可以利用promise的鏈式呼叫原理,因為promise的鏈式呼叫可以嚴格遵循呼叫時候的順序

既然要支援鏈式呼叫,那麼我們讓每乙個活動返回乙個promise物件,那麼三個活動就可以作出如下修改

leta=

function()

)}letb

=function()

,1000)}

)}letc

=function()

)}

然後就可以再用乙個promise將上面三個活動包起來,以下面這樣的形式進行呼叫:

new

promise

(function

(resolve)).

then

(function()

).then

(function()

).then

(function()

)

輸出結果:123

了解了核心功能的實現之後,就可以進行**編寫

function

lazyman

(name)

function

_lazyman

(name)

this

.fun_stack.

push

(fn)

settimeout

(function()

)})}

這裡使用的flag就相當於充當了所有活動最外層包裹的promise,用於實現鏈式呼叫的順序執行

fun_stack用於將活動暫存,因為有firstsleep與sleep的存在,所以不能一呼叫事物就立即執行,需要進行暫存

在清空fun_stack時使用了settimeout,是因為要等到鏈式完整書寫完才能執行,否則會出現鏈式呼叫無法執行

首先是sleep

_lazyman.prototype.

sleep

=function

(time)

, time *

1000)}

)}this

.fun_stack.

push

(fn)

return

this

}

sleepfirst實現和sleep幾乎一樣,唯一的不同是入佇列時要壓到佇列最前方,保證鏈式呼叫時優先執行

_lazyman.prototype.

sleepfirst

=function

(time)

, time *

1000)}

)}this

.fun_stack.

unshift

(fn)

return

this

}

_lazyman.prototype.

eat=

function

(food)

this

.fun_stack.

push

(fn)

return

this

}

這部分沒有一部**,因此直接使用promise.resolve()返回乙個已經resolve的promise物件

lazyman

('怪鴿~').

sleepfirst(1

).eat(

'奧利給').

sleep(2

).eat(

'老八秘製小漢堡'

實現乙個Semaphore

其實這是我boss的想法,我一開始聽他這麼說也覺得比較差異,ms已經寫好了何必再自己寫乙個.答案有兩個 1ms寫的東西未必就是最好的,如完成埠,heap等.2semaphore是多執行緒程式設計中的核心元素所以有必要提速.我們都知道在多執行緒中ms提供的多個現成阻塞核心物件中critical mon...

乙個Redis Cache實現

應用中需要通過http呼叫遠端的資料,但是這個獲取過程需要執行較長時間,而且這個資料本身的變化也不頻繁,這種情況最適合用乙個cache來優化。前兩年在做短鏈結實現的時候,曾經用最好的語言php做過乙個redis cache實現 乙個簡單的redis應用 修訂版 但那個畢竟是乙個特定的實現,而且我現在...

實現乙個call

call是js最好用的函式之一,改變函式上下文是外掛程式編寫最經常使用的特性。var name 小鋼炮 var cat function say name say ketty 小鋼炮 ketty say.call cat,ketty 貓 ketty看下面 function say name var ...