如何使用promises来模拟同步for循环

时间:2017-07-26 08:14:23

标签: node.js while-loop promise

我无法让Promise工作(我认为他们应该这样做)。以下代码几乎立即执行。即。在将每个号码记录到控制台之前不会等待4秒。

function do_nothing(a) {
    return new Promise(function(accept, reject){
        console.log(a)
        setTimeout(accept(parseInt(a)+1), 4000);
    });
}

function do_til_finish(i) {
    if (parseInt(i) < 5) {
        do_nothing(i)
            .then(j => do_til_finish(j))
            .catch(j =>{})
    } else {
        console.log('All done');    
    }
}
do_til_finish(0);

jsfiddle

我错过了什么?

顺便说一句。我不想异步运行循环,因为语句将使用所有内存并冻结服务器。

这不是网络服务器所以我不必担心会让用户感到沮丧。

提前致谢

3 个答案:

答案 0 :(得分:1)

您未使用setTimeout内的功能。

试试这个:

function do_nothing(a) {
  return new Promise(function(accept, reject){
    console.log(a)
    setTimeout(function(){accept(parseInt(a)+1)}, 4000);
  });
}

function do_til_finish(i) {
  if (parseInt(i) < 5) {
    do_nothing(i)
      .then(j => do_til_finish(j))
      .catch(j =>{})
  } else {
    console.log('All done');    
  }
}
console.log("\n");
do_til_finish(0);

答案 1 :(得分:1)

首先,你需要将一个函数传递给setTimeout而不是调用它。

其次,您需要从do_til_finish返回一个承诺,以便进一步调用。

顺便说一下,你不需要parseInt

&#13;
&#13;
function do_nothing(a) {
  return new Promise(function(accept, reject){
    console.log(a)
    setTimeout(accept, 4000, a + 1);
  });
}

function do_til_finish(i) {
  if (i < 5) {
    return do_nothing(i)
      .then(do_til_finish)
      .catch(j =>{})
  } else {
    console.log('All done');    
  }
}
console.log("\n");
do_til_finish(0);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

问题是你在没有回调的情况下使用了setTimeout函数并直接传递了一个值,它没有按预期工作。无论如何设计都非常混乱我建议您查看async模块以获得更好的异步设计模式。

function doNothing(a) {
  return new Promise((resolve) => {
    console.log(a);
    setTimeout(() => resolve(parseInt(a, 10) + 1), 4000);
  });
}

function doUntilFinish(i) {
  if (parseInt(i, 10) < 5) {
    doNothing(i)
      .then(j => doUntilFinish(j))
      .catch(err => console.log(err));
  } else {
    console.log('All done');
  }
}

doTillFinish(0);