我无法让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);
我错过了什么?
顺便说一句。我不想异步运行循环,因为语句将使用所有内存并冻结服务器。
这不是网络服务器所以我不必担心会让用户感到沮丧。
提前致谢
答案 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
。
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;
答案 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);