Node.js 如何使用承诺来模拟同步for循环

Node.js 如何使用承诺来模拟同步for循环,node.js,while-loop,promise,Node.js,While Loop,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

我无法得到工作的承诺(我认为他们应该这样做)。下面的代码几乎立即执行。即,在将每个号码记录到控制台之前不等待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);
函数不执行任何操作(a){
返回新承诺(功能(接受、拒绝){
控制台日志(a)
setTimeout(接受(parseInt(a)+1),4000);
});
}
功能完成(i){
if(parseInt(i)<5){
无所事事(i)
.然后(j=>完成(j))
.catch(j=>{})
}否则{
console.log(“全部完成”);
}
}
直到完成(0);

我错过了什么

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

这不是一个Web服务器,所以我不需要担心让用户失望


提前感谢

您没有在
设置超时
中使用函数

试试这个:

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);
函数不执行任何操作(a){
返回新承诺(功能(接受、拒绝){
控制台日志(a)
setTimeout(函数(){accept(parseInt(a)+1)},4000);
});
}
功能完成(i){
if(parseInt(i)<5){
无所事事(i)
.然后(j=>完成(j))
.catch(j=>{})
}否则{
console.log(“全部完成”);
}
}
控制台日志(“\n”);
直到完成(0);

首先,您需要将函数传递给
setTimeout
以避免调用它

其次,您需要从
do__\u finish
返回一个承诺,以链接进一步的调用

顺便说一句,您不需要
parseInt

函数不执行任何操作(a){
返回新承诺(功能(接受、拒绝){
控制台日志(a)
设置超时(接受,4000,a+1);
});
}
功能完成(i){
如果(i<5){
返回不做任何事情(i)
.然后(直到完成)
.catch(j=>{})
}否则{
console.log(“全部完成”);
}
}
控制台日志(“\n”);

直到完成(0)问题在于,您在没有回调的情况下使用了setTimeout函数,并直接传递了一个值,该值未按预期工作。不管怎么说,这个设计非常混乱,我建议您查看模块以获得更好的异步设计模式

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);
功能未完成(a){
返回新承诺((解决)=>{
控制台日志(a);
setTimeout(()=>resolve(parseInt(a,10)+1),4000;
});
}
函数doUntilFinish(i){
if(parseInt(i,10)<5){
多诺辛(一)
.然后(j=>doUntilFinish(j))
.catch(err=>console.log(err));
}否则{
console.log(“全部完成”);
}
}
doTillFinish(0);