У меня есть структура, подобная массиву, которая предоставляет асинхронные методы. Асинхронный метод вызывает структуры массива возврата, которые, в свою очередь, предоставляют больше асинхронных методов. Я создаю еще один объект JSON для хранения значений, полученных из этой структуры, поэтому мне нужно быть осторожным при отслеживании ссылок в обратных вызовах.
Я написал решение для грубой силы, но я хотел бы узнать более идиоматическое или чистое решение.
- Шаблон должен повторяться для n уровней вложенности.
- Мне нужно использовать обещание.all или какой-либо подобный метод, чтобы определить, когда разрешить процедуру включения.
- Не каждый элемент обязательно требует выполнения асинхронного вызова. Итак, во вложенном обещании я не могу просто назначать элементы массива JSON на основе индекса. Тем не менее мне нужно использовать что-то вроде обещания.all во вложенном forEach, чтобы гарантировать, что все присвоения свойств были выполнены до разрешения включающей подпрограммы.
- Я использую библиотеку обещаний bluebird, но это не требование
Вот частичный код -
var jsonItems = [];
items.forEach(function(item){
var jsonItem = {};
jsonItem.name = item.name;
item.getThings().then(function(things){
// or Promise.all(allItemGetThingCalls, function(things){
things.forEach(function(thing, index){
jsonItems[index].thingName = thing.name;
if(thing.type === 'file'){
thing.getFile().then(function(file){ //or promise.all?
jsonItems[index].filesize = file.getSize();
Promise.map
(одновременным) и Promise.each
(последовательным) в этом случае, также примечание Promise.defer
устарело - код в моем ответе показывает, как этого избежать, возвращая обещания. Обещания - это возвращаемые значения.