Я хочу напечатать 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);
}
Как я могу получить желаемый результат?
Почему ты здесь обещаешь? Вы можете сделать это полностью синхронно
Это мой пример кода. Собственно, мне надо использовать запрос в части addAndPrint. Итак, я хочу использовать обещание.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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