實現乙個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 ...