我正试图在forEach中一个接一个地履行诺言。
对不起,我知道这可能是一个简单的问题,但是我发现很难找到解决方法的答案。
我希望console.log会显示如下
test
a
test
b
test
c
但是,它显示如下
test
test
test
a
b
c
这是我的代码 https://jsfiddle.net/brianivander/b6csvrn9/1/
var array1 = ['a', 'b', 'c'];
array1.forEach(function(element) {
promise().then(() => {
console.log(element);
})
});
function promise() {
return new Promise((resolve, reject) => {
console.log('test');
resolve()
})
}
感谢您的帮助。
答案 0 :(得分:5)
您不能为此使用forEach
(至少在不访问外部变量的情况下如此)-如果要使用数组方法,请改用reduce
,并传递当前的Promise作为每次的累加器:
var array1 = ['a', 'b', 'c'];
array1.reduce((a, str) => (
a.then(promise)
.then(() => {
console.log(str);
})
), Promise.resolve());
function promise() {
return new Promise((resolve, reject) => {
console.log('test');
resolve()
})
}
或者,如果您想使代码更易于阅读,请在await
循环内使用for
:
var array1 = ['a', 'b', 'c'];
(async () => {
for (const str of array1) {
await promise();
console.log(str);
}
})();
function promise() {
return new Promise((resolve, reject) => {
console.log('test');
resolve()
})
}
答案 1 :(得分:1)
您需要阅读诺言返回的数据
var array1 = ['a', 'b', 'c'];
array1.forEach(function(element) {
promise().then((result) => {
console.log(result);
console.log(element);
})
});
function promise() {
return new Promise((resolve, reject) => {
resolve('test')
})
}