эта строчка chain = chain? При первой итерации понятно зачем. Создоает новый промис уже успешно завершенный. А че с ней происходит на второй итерации(я про chain)? И изменяется ли глобальная переменная  chain в ходе цикла? Или я надумал фигни и она нужна тупо для того чтобы каждый раз создавать новый промис?
                  
                  
                  
                  
                  
                  // начало цепочки
                  
                  
                  let chain = Promise.resolve();
                  
                  
                  
                  
                  
                  let results = [];
                  
                  
                  
                  
                  
                  // в цикле добавляем задачи в цепочку
                  
                  
                  urls.forEach(function(url) {
                  
                  
                    chain = chain
                  
                  
                      .then(() => httpGet(url))
                  
                  
                      .then((result) => {
                  
                  
                        results.push(result);
                  
                  
                      });
                  
                  
                  });
                  
                  
                  
                  
                  
                  // в конце — выводим результаты
                  
                  
                  chain.then(() => {
                  
                  
                    alert(results);
                  
                  
                  });
                  
                  
                
прочитай про асинхронные операции в js
Обсуждают сегодня