Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带并行限制的runn承诺_Javascript_Promise_Coffeescript - Fatal编程技术网

Javascript 带并行限制的runn承诺

Javascript 带并行限制的runn承诺,javascript,promise,coffeescript,Javascript,Promise,Coffeescript,所以,我尝试运行N个有并行计数限制的承诺。例如,我想让3个承诺在我的程序运行时等待回调。没有更多,但仍然可能是一种情况,当2个承诺在起作用时(例如-N=5,3个并行,因此在程序结束时只有2个承诺,这是可以的) 如果没有yield sleep 1此代码不起作用,它将启动3个funcs add,记录3“#{name about to create}”,仅此而已。只要您可以等待,程序将保持此状态 但是使用yield sleep 1它可以正常工作 为什么? co=需要“co” 承诺=需要“蓝鸟” 进行中

所以,我尝试运行N个有并行计数限制的承诺。例如,我想让3个承诺在我的程序运行时等待回调。没有更多,但仍然可能是一种情况,当2个承诺在起作用时(例如-N=5,3个并行,因此在程序结束时只有2个承诺,这是可以的)

如果没有
yield sleep 1
此代码不起作用,它将启动3个funcs add,记录3“#{name about to create}”,仅此而已。只要您可以等待,程序将保持此状态

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

为什么?

co=需要“co”
承诺=需要“蓝鸟”
进行中=0
检查\u num=0
检查列表=[]
添加=(名称)->
console.log“#{name}即将创建”
进行中++
新承诺(解决、拒绝)->
setTimeout()->
console.log“#{name}已完成”
进行中--
解析(名称)
, 3000
睡眠=(t)->
新承诺(解决、拒绝)->
设置超时->
解决()
T
运行=()->co->
而检查_num<5
console.log“正在进行:#{in_progress}”
如果进行中<3
checks_list.push add(“n#{check_num++}”)
#产量睡眠1
运行()。然后()->
console.log检查\u列表
承诺。所有支票都在清单上
.然后()->
console.log检查\u列表

这个问题重复了,但用俄语

如果没有
yield
ing,您就有一个无限循环。
setTimeout
回调永远不会发生,承诺永远不会解决,循环计数器永远不会改变。使用
yield sleep 1
,循环在每次迭代中都会被中断,从而允许其他事情发生,这最终会减少
进行中的
并允许创建更多的
add
承诺,直到
check\u 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"
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"