如何在forEach中一个接一个地运行Promise

时间:2019-02-28 05:54:52

标签: javascript promise

我正试图在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()
  })
}

感谢您的帮助。

2 个答案:

答案 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')
  })
}