运行具有并行限制的N个承诺

时间:2018-09-28 12:15:31

标签: javascript promise coffeescript

因此,我正在尝试使用并行计数限制来运行N个promise。例如,我想让3答应我的程序工作时等待回调。没有更多,但仍然可能是一种情况,当2个Promise在工作时(例如-N = 5,并行3个,因此在程序结束时只有2个Promise,就可以了)

如果没有yield sleep 1,此代码将不起作用,它将开始添加3个func,并记录3个“#{name to create}”。只要您可以等待,程序将保持此状态。

但是使用yield sleep 1可以正常工作。

为什么?

co = require 'co'
Promise = require "bluebird"

in_progress = 0
check_num = 0
checks_list = []

add = (name) ->
    console.log "#{name} about to create"
    in_progress++
    new Promise (resolve, reject) ->
        setTimeout () ->
            console.log "#{name} completed"
            in_progress--
            resolve(name)
        , 3000

sleep = (t) ->
    new Promise (resolve, reject) ->
        setTimeout ->
            resolve()
        , t

run = () -> co ->
    while check_num < 5
        console.log "in progress: #{in_progress}"
        if in_progress < 3
            checks_list.push add("n#{check_num++}")
        # yield sleep 1


run().then () ->
    console.log checks_list

    Promise.all checks_list
    .then () ->
        console.log checks_list

PS。此问题重复this,但它是俄语的。

1 个答案:

答案 0 :(得分:1)

如果没有yield,您将遇到无限循环。 setTimeout回调永远不会发生,承诺将永远无法解决,循环计数器也不会改变。使用yield sleep 1时,循环将在每次迭代时中断,从而允许其他事件发生,最终将减少in_progress并允许创建更多add个承诺,直到check_num被创建为止5。

请注意,由于您使用的是Bluebird,因此不需要任何这些,甚至都不需要co

Promise = require "bluebird"

add = Promise.coroutine (name) ->
    console.log "#{name} about to create"
    yield Promise.delay 3000
    console.log "#{name} completed"

Promise.map ("n#{check_num}" for check_num in [0..5]),
            add,
            concurrency: 3
.then ->
    console.log "all done"