Циклы и Promise

281
23 декабря 2017, 07:25

Есть цепочка промисов, первый берет id пользователей из БД, потом по нему нужно достать его группы, и имена конструкторов. И это все может быть в нескольких экземплярах. Как следствие - циклы в циклах. В конечном счете получаю объект только одного пользователя

async(takeIds() 
  .then(ids => { 
    // console.log("ids", ids); 
    for (var i = 0; i < ids.length; i++) { 
      data.id = ids[i]; 
      await (takeIdvk(ids[i]) 
        .then(idm => { 
          data.idvk = idm; 
          takeIdg(data.id) 
            .then(res => { 
              takeNamesCycle(res, data) 
                .then(data => { 
                  console.log("data", data); 
                }) 
                .catch(err => { 
                  console.log(err); 
                }); 
            }) 
            .catch(err => { 
              console.log(err); 
            }); 
        }) 
        .catch(err => { 
          console.log(err); 
        })); 
    } 
  }) 
  .catch(function(err) { 
    console.log(err); 
  }));

И функция takeNamesCycle, так как она отличается от остальных (в остальных простые запросы к БД):

var takeNamesCycle = async(function(arr, obj) { 
  return new Promise((resolve, reject) => { 
    for (var i = 0; i < arr.length; i++) { 
      var idg = arr[i]; 
      await (takeNames(arr[i]) 
        .then(names => { 
          obj.idg[idg] = names; 
        }) 
        .catch(err => { 
          console.log(err); 
        })); 
    } 
    resolve(obj); 
  }); 
});

Может, можно как-то упростить это все? Буду очень благодарен

Answer 1

Возможно я что-то не то предлагаю, но я бы переписал код вот так (обернув в async функцию main):

async function main() {
  let ids = await takeIds();
  for (let id of ids) {
    data.id = id;
    let idm = await takeIdvk(id);
    data.idvk = idm;
    let res = await takeIdg(id);
    let data = takeNamesCycle(res, data);
    console.log('data', data);
  }
}

Это в предположении, что у вас существуют следующие функции:

async function takeIds() { ... }
async function takeIdvk() { ... }
async function takeIdg() { ... }

Вот вариант с «обработкой» ошибок — оборачиваем весь код вот так:

try {
    // код
} catch (e) {
    console.log(e);
}

В вашем случае:

async function main() {
  try {
    let ids = await takeIds();
    for (let id of ids) {
      data.id = id;
      let idm = await takeIdvk(id);
      data.idvk = idm;
      let res = await takeIdg(id);
      let data = takeNamesCycle(res, data);
      console.log('data', data);
    }
  } catch (e) {
    console.log(e);
  }
}
READ ALSO
Как правильней использовать mousemove в angular2?

Как правильней использовать mousemove в angular2?

Сделал прокрутку с мышкой налево и направоНо чуть не правильно

229
Видео внутри текста

Видео внутри текста

Нужно в #30 вставить видео (Смотреть Картинку ниже по ссылку) Чтобы в этой цифре с решеткой показывалось видео)))

222
Выбор кратчайшего пункта , используя gmaps api

Выбор кратчайшего пункта , используя gmaps api

ПриветЗнакомлюсь с google maps api и возник такой вопрос

226
Console time разные показания! Парсинг на стороне клиента. Что быстрее?

Console time разные показания! Парсинг на стороне клиента. Что быстрее?

Здравствуйте, Есть две структуры данных, пытаюсь разобрать, какой вид быстрее будет парситься на клиенте:

200