如何使用promise来模拟同步循环

我无法让诺言工作(我认为他们应该这样做)。 以下代码几乎立即执行。 即。 在将每个号码logging到控制台之前不等待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

我错过了什么?

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

这不是一个networking服务器,所以我不需要担心令人沮丧的用户。

提前致谢

你在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); 

首先你需要传递一个函数setTimeout来调用它。

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

顺便说一句,你不需要parseInt

 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); 

问题是你使用setTimeout函数没有callback,并直接传递一个值,这是不能按预期工作。 任何方式的devise是相当凌乱我build议你看看asynchronous模块更好的asynchronousdevise模式。

 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);