Javascript 为什么我的带承诺的递归函数只等待一次?

Javascript 为什么我的带承诺的递归函数只等待一次?,javascript,promise,towers-of-hanoi,Javascript,Promise,Towers Of Hanoi,我试图将“河内塔”(Tower of Hanoi)问题形象化,并尝试使用承诺让函数在继续解决问题之前等待一张光盘的运动被动画化(我用setTimeout模拟)。此测试代码计算正确的移动,但只等待动画一次,然后立即吐出其余的动作: var A = "rod A"; var B = "rod B"; var C = "rod C"; solve(3,A,C,B); function solve (n,source,target,spare) {

我试图将“河内塔”(Tower of Hanoi)问题形象化,并尝试使用承诺让函数在继续解决问题之前等待一张光盘的运动被动画化(我用setTimeout模拟)。此测试代码计算正确的移动,但只等待动画一次,然后立即吐出其余的动作:

    var A = "rod A";
    var B = "rod B";
    var C = "rod C";

    solve(3,A,C,B);

    function solve (n,source,target,spare) {
        var promise = new Promise(function(resolve,reject){
            if (n==1) {
                setTimeout(function(){
                    console.log("move a disc from "+source+" to "+target);
                    resolve();
                },1000);
            }
            else {
                        solve(n-1,source,spare,target)
                .then(  solve( 1 ,source,target      )  )
                .then(  solve(n-1,spare,target,source)  )
                .then(  resolve()                       );
            }
        });
        return promise;
    }
对于不知道问题所在的人,我将代码简化了一点,基本上目标是打印“移动”七次,每次延迟1秒:

    solveTest(3);

    function solveTest (n) {
        var promise = new Promise(function(resolve,reject){
            if (n==1) {
                setTimeout(function(){
                    console.log("move");
                    resolve();
                },1000);
            }
            else {
                        solveTest(n-1)
                .then(  solveTest( 1 )  )
                .then(  solveTest(n-1)  )
                .then(  resolve()       );
            }
        });
        return promise;
    }

问题是您正在立即调用所有调用,然后将它们的返回值作为参数传递给
.then()
。您需要做的是将函数传递给调用它们的
。然后()

功能睡眠(毫秒){
返回新承诺(函数(解析){
设置超时(解析,毫秒)
})
}
函数求解(n、源、目标、备用){
如果(n==1){
返回睡眠(1000)。然后返回(函数(){
console.log('将光盘从'+源+'移动到'+目标')
})
}否则{
返回solve(n-1,source,spare,target){
返回解算(1、源、目标、备用)
}).然后(函数(){
返回解算(n-1,备用,目标,源)
})
}
}
solve(3,'rod A','rod B','rod C')
。然后(resolve())
不会执行您认为它会执行的操作,也不会执行任何其他函数调用作为
的参数。然后()
可能重复的