Promise小工具:PromiseQueue
肿瘤学硕士 Linux用户 打杂码农
Javascript中的异步编程问题常常让人头疼,特别是对于接触Javascript时间不长的(比如我)。(由于讨厌Javascript罗嗦的语法,我大量使用Coffeescript写Javascript)
比如说,要做一堆异步操作,等待所有操作返回:
work1 = new Promise (ok)->
setTimeout ->
ok console.log '1 done'
, 1000
work2 = new Promise (ok)->
setTimeout ->
ok console.log '2 done'
, 1000
works = [work1, work2]
Promise.all works
.then ->
console.log 'all done'
再比如说,等待其中一个操作返回:
work1 = new Promise (ok)->
setTimeout ->
ok console.log '1 done'
, 1000
work2 = new Promise (ok)->
setTimeout ->
ok console.log '2 done'
, 1000
works = [work1, work2]
Promise.race works
.then ->
console.log 'some done'
最近在整理一些工具,今天提得是个小工具,它让操作排起队来,前一个结束后一个才开始:
class PromiseQueue
constructor: ->
@q = []
then: (f)->
console.assert f instanceof Function
@q.push f
this
done: (f)->
if f instanceof Function
@q.push f
@q.reduce (s, e)->
s.then e
, Promise.resolve()
work1 = ->
new Promise (ok)->
setTimeout ->
ok console.log '1 done'
, 1000
work2 = ->
new Promise (ok)->
setTimeout ->
ok console.log '2 done'
, 1000
q = new PromiseQueue()
q.then work1
.then work2
.done ->
console.log 'all done'