2017-01-03 40 views
0

這可能看起來像一個奇怪的問題,但讓我解釋一下: 我有這個功能,我想變成一個承諾,因爲我相信一些事件沒有完全開火,其他人以前開始(例如,playersOverallTotal的狀態是錯誤的因爲我認爲它並沒有考慮到上面的代碼做,所以我需要等待它設置狀態如何開始JavaScript的承諾?

handleClickTwist() { 
    this.dealToPlayer(); 
    this.forceUpdate(); 
    let playersDeck = this.state.playersDeck; 
    let playersDeckTotal = []; 
    for (var i=0; i < playersDeck.length; i++){ 
     playersDeckTotal.push(playersDeck[i].rankValue) 
    } 

    let total = playersDeckTotal.reduce(function(a, b) { 
     return a + b; 
     }, 
    0); 

    this.setState({playersOverallTotal: total}); 
    this.total(); 
    }; 

我知道之前完成承諾看起來像下面

anotherFunc(){ 
    return new Promise((resolve, reject) => { 
     resolve() 
    } 
    } 

然後我可以c所有這樣的事情:

this.func().then(() => { 
     return this.anotherFunc(); 
    }).then(() => { 
     return Promise.resolve(this.setState({playersOverallTotal: total})) 
    }).then(() => { 
     return this.anotherFun(); 

但我不能想到如何爲此代碼做到目前爲止。或者說,我可以在anotherFunc()的功能關閉的初始功能是什麼?

+0

「什麼是最初的功能,我可以在anotherFunc調用()踢功能關閉?」 - 那就是'Promise',你已經在那裏打電話了。 – Quentin

+1

我在代碼中看不到任何異步函數。所以你不需要承諾。如果「dealToPlayer()」或「forceUpdate()」是異步的,那麼它們應該接受回調或返回一個承諾。你的問題不在於'handleClickTwist()'函數 – slebetman

+0

默認情況下,javascript代碼在繼續前等待前面的代碼完成。承諾和回調允許您在某個外部進程正在運行時執行某些操作 - 例如:加載圖像或json文件。在你的代碼中,我沒有看到任何外部進程,所以你的錯誤很可能只是一個編程錯誤。這取決於你的其他功能(dealToPlayer(),forceUpdate()等) – Kokodoko

回答

2

也許你錯過了一些共識:

首先,我沒有看到你的代碼,這可以通過承諾來解決任何可能的問題,但無論如何,在你的例子:

anotherFunc(){ 
    return new Promise((resolve, reject) => { 

     // do some crazy stuff here 
     // if you do an ajax call put "resolve" 
     // into success function after ajax is finished 

     if(allIsFine) { 
     resolve(passAnyData); 
     } else { reject() }; 
    } 
    } 

則調用

anotherFunc().then(function(passAnyData) { 
// resolve called with passAnyData 


}).catch(function() { 
// some error 
}); 
+0

確定。讓我這樣寫: 'let total = playersDeckTotal.reduce(function(a,b){ return a + b; }, 0); console.log(playersDeckTotal,'deck'); console.log(total,'t0t1'); //記錄19如預期 this.setState({playersOverallTotal:total});因爲它打折了最後的數字,所以console.log(this.state.playersOverallTotal,'tot');'//記錄14。 它爲什麼要這樣做? –

+0

好的解決了,我需要暫停。會將你的標記標記爲正確 –