Существует ли чисто основанный на Promise подход для сопоставления / объединения коллекций?
я изучаю разработку Node.js и пытаюсь обдумать стратегии управления асинхроннымобратный вызов ада ", Две основные стратегии, которые ямы исследовали Колана МакМахонаасинхронной модуль, и Крис Ковальна основе обещаний Q модуль.
подобномного других людейЯЯ все еще пытаюсь понять, когда вы должны использовать одно против другого. Однако, вообще говоря, я нашел обещания и основанный на Q коднемного более интуитивно, поэтому я двигался в этом направлении.
Отображение / объединение коллекций в целомОднако я'Я все еще застрял с помощью асинхронного модуляфункции для управления коллекциями, Исходя из Java и Python, в большинстве случаев, когда я работаю с коллекцией, логика выглядит следующим образом:
Инициализируйте новую пустую коллекцию, в которой будут храниться результаты.Выполните цикл for-each со старой коллекцией, применив некоторую логику к каждому элементу и поместив его результат в новую пустую коллекцию.Когда цикл for-each заканчивается, переходите к использованию новой коллекции.В клиентском JavaScript ямы привыкли к использованию jQuery'sфункция map ()... передавая логику этого шага № 2 и получая результат шага № 3 в качестве возвращаемого значения. По ощущениям тот же базовый подход.
Отображение / объединение коллекций с асинхронным и QАсинхронный модуль на стороне узла имеет аналогичныйкарта а такжеCONCAT функции, но они неt вернуть объединенный результат обратно на исходный уровень контекста. Вместо этого вы должны спуститься в ад обратного вызова, чтобы использовать результат. Пример:
var deferred = Q.defer();
...
var entries = [???]; // some array of objects with "id" attributes
async.concat(entries, function (entry, callback) {
callback(null, entry.id);
}, function (err, ids) {
// We now have the "ids" array, holding the "id" attributes of all items in the "entries" array.
...
// Optionaly, perhaps do some sorting or other post-processing on "ids".
...
deferred.resolve(ids);
});
...
return deferred.promise;
Поскольку мои другие функции становятся основанными на обещаниях, у меня есть этот код, возвращающий объект обещаний, чтобы его можно было легко включить вthen()
цепь.
Главный вопрос, который яЯ изо всех сил пытаюсь сформулировать это: действительно ли мне нужны оба асинхронныха также Q в примере кода выше? Я'я учусь заменять асинхронный модульпоток управления с цепочками обещаний Q-стиля вообще ... но это непока нет "щелкнул» для меня, как сделать отображение или объединение коллекций с подходом на основе обещаний. В качестве альтернативы яЯ хотел бы понять, почему вы можетет, или почему этоне очень хорошая идея
Если async и Q предназначены для совместной работы, как я использую их в примере выше, то пусть будет так. Но я бы предпочел не требовать дополнительных библиотечных зависимостей, если бы мог использовать только Q. (
Извините если яЯ упускаю что-то невероятно очевидное. Асинхронная модель, управляемая событиями, - это совсем другой мир, и моя голова все еще плавает.)