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

1

Я хочу напечатать 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.log(elem);
        resolve(elem);
    });
}
function addAndPrint(elem){
    console.log(elem + 100);
}

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

  • 0
    вам нужно, чтобы каждая итерация дожидалась завершения предыдущей, чтобы получить вывод tht ... поэтому используйте цепочку обещаний - например, let promise = Promise.resolve(); arr.forEach(function(elem){ promise = promise.then(() => printt(elem).then(addAndPrint)); });
  • 0
    Почему ты не обещаешь здесь? Вы можете сделать это абсолютно синхронно
Показать ещё 1 комментарий
Теги:
promise

3 ответа

1
Лучший ответ

.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.log(elem);
    resolve(elem);
  });
}

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

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

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

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

function print(elem){
  console.log(elem);
}
function addAndPrint(elem){
  console.log(elem + 100);
}
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню