Node.js foreach + обещание

Я хочу напечатать arr=[1, 2, 3, 4], как показано ниже.

1 101 2 102 3 103 4 104

но результат ниже.

1 2 3 4 101 102 103 104

мой код

var arr = [1, 2, 3, 4];


var promises = [];
arr.forEach(function(elem){
    print(elem)
        .then(addAndPrint)
}
)

function print(elem){
    return new Promise(function(resolve, reject){
        console.info(elem);
        resolve(elem);
    });
}
function addAndPrint(elem){
    console.info(elem + 100);
}

Как я могу получить желаемый результат?

вам нужно, чтобы каждая итерация ожидала завершения предыдущей, чтобы получить результат ... поэтому используйте цепочку обещаний - например, let promise = Promise.resolve(); arr.forEach(function(elem){ promise = promise.then(() => printt(elem).then(addAndPrint)); });

Jaromanda X 27.04.2018 05:15

Почему ты здесь обещаешь? Вы можете сделать это полностью синхронно

sridhar.. 27.04.2018 05:19

Это мой пример кода. Собственно, мне надо использовать запрос в части addAndPrint. Итак, я хочу использовать обещание.

errorMessage 27.04.2018 10:36
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
996
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я не уверен, с какими ограничениями вы работаете, но выбор использования обещаний требует некоторого объяснения. Потому что самое простое решение - не использовать обещания. Обещания хороши для асинхронных операций, но здесь все синхронно.

var arr = [1, 2, 3, 4];

arr.forEach(function(elem){
  print(elem)
  addAndPrint(elem);
});

function print(elem){
  console.info(elem);
}
function addAndPrint(elem){
  console.info(elem + 100);
}
Ответ принят как подходящий

.then выполняют асинхронно (аналогично setTimeout(.., 0)) (даже если обещание разрешается немедленно), тогда как функция создания обещания в new Promise((res, rej) => { выполняется синхронно. Итак, если вы создаете связку обещаний синхронно, например, с forEach, до завершения основного потока, все блоки этих обещаний будут выполняться немедленно. перед будет достигнута любая из then.

Используйте await и либо reduce, либо for..of, чтобы гарантировать, что итерации выполняются в серийном, а не параллельно:

var arr = [1, 2, 3, 4];


var promises = [];
arr.reduce(async function(lastPromise, elem) {
  await lastPromise;
  return print(elem)
    .then(addAndPrint)
}, Promise.resolve())

function print(elem) {
  return new Promise(function(resolve, reject) {
    console.info(elem);
    resolve(elem);
  });
}

function addAndPrint(elem) {
  console.info(elem + 100);
}

.then может гарантировать, что ваш метод addAndPrint(1) выполняется только после метода print(1), но не может сделать print(2) после addAndPrint(1).

Другие вопросы по теме