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

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

0 голосов
/ 27 апреля 2018

Я хочу напечатать 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);
}

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

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

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

Используйте 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);
}
0 голосов
/ 27 апреля 2018

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

0 голосов
/ 27 апреля 2018

Я не уверен, с какими ограничениями вы работаете, но выбор использования 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...