[Turn] Метод записи последовательного выполнения цикла промисов

внешний интерфейс модульный тест Promise

[Исходная ссылка] https://segmentfault.com/q/1010000007499416

【Примечание】Первоначальный текст - это пост в виде вопрос-ответ, который здесь немного разобрали, эта статья перенесена сюда для моей коллекции и удобного поиска. В случае нарушения, пожалуйстасоединятьудалять.

Требуется наличие массива объектов, элементами которого являются параметры, необходимые для каждого асинхронного события. События асинхронных событий принимают параметры и выполняются последовательно и, наконец, возвращают результат обещания.

Promise.all кажется параллельным?

const PromiseForEach = (objects, asyncDosometing) => {
    return new Promise((resolve, reject) => {
        Promise.all(objects.map((obj) => {
            return new Promise((resolve, reject) => {
                return asyncDosometing(obj).then(resolve, reject);
            });
        })).then(resolve, reject);
    });
};

Это вроде тоже параллельно пишется?

const PromiseForEach = (objects,asyncDosometing) => {
        let result = Promise.resolve();
        objects.forEach((obj) => {
            result = result.then(asyncDosometing(obj));
        });
        return result;
    }

// результат проверки
// После прямой печати "успеха", после того, как данные не определены, вывести все "числа" за один раз
// Вместо того, чтобы печатать число каждые 2 секунды после того, как число напечатано, печать прошла успешно, и данные должны быть массивом чисел

const list = [];
    for (let i = 0; i < 100; ++i) {
        list.push(i);
    }
    PromiseForEach(list, (number) => {

        return new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log(number);
                return resolve(number);
            }, 2000);
        })

    }).then((data) => {
        console.log("成功");
        console.log(data);
    }).catch((err) => {
        console.log("失败");
        console.log(err)
    });   

Кажется, есть проблема с двумя вариантами написания.
Это реализовано с помощью async/await Я не знаю, правильно это или нет, но это сбылось

const PromiseForEach = async(objects, asyncDosometing) => {
    let result = [];
    for (let obj in objects) {
        try {
            result.push(await asyncDosometing(obj));
        } catch (err) {
            return err;
        }
    }

    return result;
};

Как правильно использовать Promise для реализации этой логики? Решить! Спасибо! ! !

Ниже представлены участники сообществаwhbbответ:

второй способ правильныйЗапустить конструкцию. Может ли /code/IL просматривать внешнюю сеть...Если вам нужно вернуть результат, вы можете добавить еще один слой Promise

const list = [];
for (let i = 0; i < 100; ++i) {
    list.push(i);
}
function PromiseForEach(arr, cb) {
    let realResult = []
    let result = Promise.resolve()
    arr.forEach((a, index) => {
        result = result.then(() => {
            return cb(a).then((res) => {
                realResult.push(res)
            })
        })
    })

    return result.then(() => {
        return realResult
    })
}

PromiseForEach(list, (number) => {

    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(number);
            return resolve(number);
        }, 100);
    })

}).then((data) => {
    console.log("成功");
    console.log(data);
}).catch((err) => {
    console.log("失败");
    console.log(err)
}); 

Вот немного разного

  • Когда я впервые начал использовать обещания, я не мог найти, как использовать обещания для управления асинхронностью внутри цикла for и получения массива асинхронных результатов вне цикла.
  • пока я не увидел этовопросы и ответы,Пилаlet result = Promise.resolve()Такой способ письма делает меня счастливым. Используйте объект Promise, чтобы передать результат выполнения асинхронной задачи в качестве параметра, а затем поместите результат в глобальный массив и, наконец, получите результат.
result = result.then(() => {
            return cb(a).then((res) => {
                realResult.push(res)
            })
        })
  • Ну никакой ерунды. )>_