1. Ваши реализации выполняют не массив Promise, а массив вызовов:
function(done) {
setTimeout(function() {
done('result');
}, duration);
};
Скорей всего, вам надо было выполнять таски вида:
new Promise(resolve => {
setTimeout(resolve, duration, 'result');
});
2. Называйте функции и аргументы по-человечески, а не array, newArray, funcArray.
3. Для параллельного выполнения с вызовом колбека done, достаточно:
function all(promises, done) {
const results = [];
let count = promises.length;
const checkDone = () => {
if (--count === 0) done(results);
};
promises.forEach((p, i) => {
p.then(x => results[i] = x).then(checkDone);
});
}
Для имитации Promise.all:
function promiseAll(promises) {
return new Promise(resolve => {
const results = [];
let count = promises.length;
const checkDone = () => {
if (--count === 0) resolve(results);
};
promises.forEach((p, i) => {
p.then(x => results[i] = x).then(checkDone);
});
});
}
Реализацию последовательного выполнения прикладывать не буду, так как ее ну слишком просто найти в поисковике.