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