2016-07-19 67 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