Выполнить N обещаний с параллельным ограничением - PullRequest
0 голосов
/ 28 сентября 2018

Итак, я пытаюсь выполнить N обещаний с параллельным ограничением числа.Я хочу, например, 3 обещания, ожидающих обратного вызова, пока моя программа работает.Не более, но все же может быть ситуация, когда 2 обещания на работе (пример - N = 5, 3 параллельно, поэтому в конце программы будет только 2 обещания, и все нормально)

Безyield sleep 1 этот код не работает, он запустит 3 функции 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

PSTЭтот вопрос дублирует это , но на русском языке.

1 Ответ

0 голосов
/ 28 сентября 2018

Без 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...