2016-07-19 19 views
0

我创建一个游戏,用户写道,将执行和做的东西,如移动机器人的功能之前完成/旋转等 我有这样的代码:等待函数来执行下一个命令

function move(){ 
    setTimeout(function(){ 
     console.log("Log 1,5"); 
    }, 3000); 

    return true; 
    } 

    function anotherMove(){ 
    setTimeout(function(){ 
     console.log("Log 2,5"); 
    }, 2000); 

    return true; 
    } 

    function action(){ 
    console.log("Log 1"); 
    move(); 
    console.log("Log 2"); 
    anotherMove(); 
    console.log("Log 3"); 
    } 


    action(); 

想象一下move/another移动为机器人移动和console.logs作为这些移动之间的计算。是否有正确的输出日志:1 - > 1,5 - > 2 - > 2,5(目前它的1 - > 2 - > 3 - > 1,5 - > 2,5),基本上console.log等待move/another在执行这些日志之前移动完成。

我可以改变移动/ anotherMove结构(这将是帆布动画),但我要的是行动()结构的逗留,因为它是...

非常感谢!

+0

为了使它工作,你所希望的方式,它会冻结该页面并没有人会想要玩这个游戏。阅读异步JavaScript。它有大量的信息。 –

回答

1

承诺做你正在寻找。这些在ES6中可用,或者有几个库,例如Q

你会开始一个承诺包超时...

function timeout(ms) { 
    return new Promise(function (resolve, reject) { 
     setTimeout(resolve, ms); 
    }); 
} 

现在,超时函数会返回一个承诺,其可以使用该功能then()另一个承诺被链接。因此,举例来说,你move()功能可提高为...

function move(aString, aDelay) { 
    return timeout(aDelay).then(() => { 
     console.log(aString); 
     true; 
    }); 
} 

的动作功能几乎写道本身......

function action() { 
    console.log("Log 1"); 
    return move("Log 1.5", 3000).then(() => { 
     console.log("Log 2"); 
     move("Log 2.5", 2000); 
    }).then(() => { 
     console.log("Log 3"); 
    }); 
} 
+1

感谢您的回答,但那正是我想的,我不想更改action()函数,因为那个函数将由用户编写。 – blx