JS: какие обещания эквивалентны async.each?

Кажется, сегодня было объявлено, что обещания будут в ES6.

Я никогда не был сторонником обещаний — эпические цепочки .then() кажутся более сложными, чем простой список функций в async.waterfall(), но, похоже, мне все равно придется их изучить.

Так что же является эквивалентом другого очень популярного рабочего процесса, async.each()?

async.each(items, processItem, function(err){
    doSomething(err)
});

Например, запустите функцию processItem над каждым элементом, после того как все они будут завершены, продолжите с doSomething (делая что-то другое, если какой-либо из processItem() облажался).

  • Как я могу сделать это в обещаниях?
  • Есть ли официальное место для пользовательских документов по обещаниям (не спецификация обещаний, реальные примеры рабочих процессов) и как бы вы сделали их в промисах) как там для асинхронности?

person mikemaccana    schedule 19.09.2013    source источник
comment
Ну, во-первых, вы игнорируете то большое дело, что если в водопаде произойдет исключение, это просто приведет к сбою процесса. См. jsfiddle.net/LvRs8. Вы можете использовать как try-catches, так и errbacks, но вы не можете думать, что иметь 2 разных стиля обработки ошибок проще, чем промисы, где все будет распространяться на .catch(), как в синхронном коде.   -  person Esailija    schedule 07.10.2013


Ответы (2)


Есть ли официальное место для пользовательских документов обещаний (не спецификации обещаний, реальных примеров рабочих процессов и того, как вы будете выполнять их в обещаниях), например, для асинхронности?

Мы собираем страницу общих ресурсов по обещаниям на Q wiki. . Что касается рабочих процессов и композиции, я считаю, что "Как Составление промисов Node.js с помощью Q" было бы наиболее полезным; на самом деле это не относится к Node.js, несмотря на название.

person Domenic    schedule 07.10.2013
comment
Это превосходно — особенно полезна асинхронность с сущностью обещаний. - person mikemaccana; 07.10.2013

Как я могу сделать это в обещаниях?

Предполагая, что processItem теперь не принимает обратный вызов, а возвращает обещание, которое вы написали бы

all(items.map(processItem)).then(doSomething);

Где all – это функция all вашей библиотеки, которая принимает массив обещаний, например Q.all. Если у вас его нет, подойдет эта простая реализация:

function all(promises) {
    return promises.reduce(function(m, p) {
        return m.then(function(res) {
            return r.then(function(r) { return res.concat([r]); });
        });
    }, fulfill([]));
}

Есть ли официальное место для пользовательских документов обещаний (а не спецификации обещаний, рабочих процессов и того, как вы будете выполнять их в обещаниях), например, есть асинхронность?

Неа. Каждая библиотека Promise имеет свою собственную документацию, и в Интернете есть множество учебных пособий. «Официальные» — это только спецификации, которые, я думаю, кратки и достаточно понятны для пользователя.

person Bergi    schedule 19.09.2013