如何在for循环中使用带有超时的promises?

时间:2017-01-13 14:30:01

标签: javascript jquery promise ecmascript-6 es6-promise

我的函数很少,应该在循环中逐个执行并有延迟。这是我的代码:

function func1() {
  for (var i = 0; i < 3; i++) {
    func2().then(); // await in loop until func2() completed       
  }
}

function func2() {
  return new Promise(succes) {
    for (var i = 0; i < 10; i++) {
      function3().then(); //wait untill function3 and then continue looping
    }
    success();
  }
}

function function3() {
  return new Promise(function(ready) {
    setTimeout(function() {
      // do some stuff
      ready();
    }, 2000);
  });
}

但它不起作用。我应该改变什么?

3 个答案:

答案 0 :(得分:4)

我认为您打算使用的是ES8&#39; s(ES2017)async/await构造:

&#13;
&#13;
async function func1() {
  for (var i = 0; i < 3; i++) {
    console.log(`func1 waiting for func2 #${i + 1}`);
    await func2(); // await in loop until func2() completed 
    console.log(`Finished iteration ${i} for func1`);
  }
}

async function func2() {
  console.log('Started func2');
  for (var i = 0; i < 10; i++) {
    console.log(`func2 waiting for func3 #${i + 1}`);
    await function3(); //wait untill function3 and then continue looping
  }
}

function function3() {
  return new Promise(resolve => setTimeout(resolve, 1000));
}

func1().then(() => console.log('finished'));
&#13;
&#13;
&#13;

要获得更广泛的浏览器支持,您可以使用Babel

答案 1 :(得分:0)

我不知道它是最好的解决方案,但它是某种方式,我认为这很容易实现。

&#13;
&#13;
function func1(i){
     i++;
     return new Promise(function(ready){
            setTimeout(function(){  
                func2(i);
                ready(i);           
            }, 1000); 
    });
}

function func2(i = 0){
  if(i < 10){
    func1(i).then((test) => {
      console.log(test);
    })
  } else {
    return false;
  }
}
func2();
&#13;
&#13;
&#13;

答案 2 :(得分:-1)

你可以使用jQuery&#39; .each(),它是同步的,所以下一个循环不会一直触发,直到前一个结束。你也可以添加回调,但这里并不需要它们。