javascript - 运行 N 个具有并行限制的 Promise
问题描述
所以,我正在尝试运行 N 个具有并行计数限制的 Promise。例如,我希望在我的程序运行时有 3 个承诺等待回调。不多,但仍然可能是一种情况,当 2 个 promise 起作用时(例如 - N = 5, 3 个并行,所以在程序结束时只有 2 个 promise,没关系)
没有yield sleep 1
此代码将不起作用,它将启动 3 funcs add,记录 3 "#{name about 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
PSThis question重复了这个,但它是俄语的。
解决方案
没有yield
ing,你只有一个无限循环。回调永远不会发生,setTimeout
promise 永远不会解决,你的循环计数器永远不会改变。使用yield sleep 1
,循环在每次迭代时被中断,允许其他事情发生,最终会减少in_progress
并允许add
创建更多的 Promise 直到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"
推荐阅读
- wordpress - 检索 AFC 图像字段
- google-apps-script - 通过 Google Script 在 Google 表单中自动填写答案
- ibm-mq - IBM MQ 中的集群 PUB/SUB 是否涉及使用集群通道来传递消息?
- swift - 使用 Alamofire 的同步请求
- python - 进行 Python 测验
- html - 登录页面 - 自动清除提交以前的条目
- android - Renderscript 库 Android Studio 3.3 找不到文件 sdk\build-tools\28.0.0\renderscript\lib\androidx-rs
- ruby-on-rails - 在 Ruby on Rails 中的 Heroku 上错误地调用了注销路径
- macos - TFVC Visual Studio mac,无法登录
- node.js - SyntaxError: Unexpected token { 开始时