如何用JavaScript开始承诺?
这似乎是一个奇怪的问题,但请允许我解释一下: 我有这个功能,我想把它变成一个承诺,因为我相信一些事件没有完全启动,而其他事件在启动之前(例如,PlayerOverallTotal的状态是错误的,因为我认为它没有考虑到上面的代码,所以我需要等待它完成,然后再设置状态如何用JavaScript开始承诺?,javascript,promise,Javascript,Promise,这似乎是一个奇怪的问题,但请允许我解释一下: 我有这个功能,我想把它变成一个承诺,因为我相信一些事件没有完全启动,而其他事件在启动之前(例如,PlayerOverallTotal的状态是错误的,因为我认为它没有考虑到上面的代码,所以我需要等待它完成,然后再设置状态 handleClickTwist() { this.dealToPlayer(); this.forceUpdate(); let playersDeck = this.state.playersDeck;
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();
};
然后我可以这样称呼:
this.func().then(() => {
return this.anotherFunc();
}).then(() => {
return Promise.resolve(this.setState({playersOverallTotal: total}))
}).then(() => {
return this.anotherFun();
但到目前为止,我无法思考如何处理这段代码。或者更确切地说,我可以在
anotherFunc()
中调用什么初始函数来启动该函数?也许您缺少一些共同的理解:
首先,我看不出您的代码有任何可能的问题,这些问题可以通过承诺解决,但可以通过任何方式解决,如您的示例所示:
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
});
“我可以在anotherFunc()中调用什么样的初始函数来启动该函数?”-那将是
Promise
,您已经在那里调用了它。我在您的代码中没有看到任何异步函数。因此您不应该需要Promise。如果dealToPlayer()
或forceUpdate()
是异步的,则它们应该接受回调或返回承诺。您的问题不在于handleClickTwist()
function默认情况下,javascript代码会等待上一个代码完成后再继续。承诺和回调允许您在某些外部进程运行时执行某些操作,例如:加载图像或json文件。在您的代码中,我看不到任何外部进程,因此您的错误很可能只是编程错误。这取决于nds关于其他函数(dealToPlayer()、forceUpdate()等)的作用,好的,让我这样说:let total=playerDeckTotal.reduce(函数(a,b){return a+b;},0);console.log(playerDeckTotal,'deck');console.log(total,'t0t1');//logs 19如预期的那样。setState({playerOverallTotal:total});console.log(this.state.playersOverallTotal,'tot');
//日志14,因为它打折了最后的数字。为什么要这样做?好的,我需要一个超时。但会将您的标记为正确
anotherFunc().then(function(passAnyData) {
// resolve called with passAnyData
}).catch(function() {
// some error
});