Javascript 使用webworker和promise处理异步函数

Javascript 使用webworker和promise处理异步函数,javascript,asynchronous,promise,blocking,Javascript,Asynchronous,Promise,Blocking,在调用下面代码段中定义的asyncFunc时,我尝试处理承诺的返回,以获得阻塞行为。在这个函数中,我使用的是webworker 我不是javascript方面的专家,promise的概念对我来说是全新的。我试图在代码块中定义一个asyncFunc函数。 如果我在之后调用此函数,通常应该完全执行asyncFunc中的代码(但我不确定) 目标是在webworker收到要在此处绘制的数组(HitCurrentvariable)后,即以同步方式(绘制功能由displayCurrentHit(HitCur

在调用下面代码段中定义的asyncFunc时,我尝试处理承诺的返回,以获得阻塞行为。在这个函数中,我使用的是webworker

我不是javascript方面的专家,promise的概念对我来说是全新的。我试图在代码块中定义一个
asyncFunc
函数。 如果我在之后调用此函数,通常应该完全执行asyncFunc中的代码(但我不确定)

目标是在webworker收到要在此处绘制的数组(
HitCurrentvariable
)后,即以同步方式(绘制功能由
displayCurrentHit(HitCurrent);
执行)在画布中绘制(当前表示游戏板)

else如果(模式=='computer'){
//用promise调用异步函数
函数asyncFunc(当前){
//回报承诺
返回新承诺(解决=>{
//webworker的创建
让firstWorker=newworker(workerScript);
firstWorker.onmessage=函数(事件){
解析(事件数据);
}   
//HitCurrent的后当前副本,即HitCurrent
firstWorker.postMessage([HitCurrent,HitCurrent.playerCurrent,maxNodes]);
})。然后({result})=>{
//找回webworker的游戏板
HitCurrent=result.HitResult;
//取回由webworker计算的建议命中率
[a,b]=HitCurrent.coordPlayable;
log('Into-promise:coordPlayable:(a,b)=',a,b);
//从建议的命中中绘制所有线(在8个方向)
对于(k=0;k<8;k++){
探索性地契线(当前、a、b、k,‘图纸’);
}   
//删除可播放的点击
清除命中(“可播放”,当前命中率);
//显示当前游戏
显示当前点击(当前点击);
//到目前为止,第一台电脑很好
//游戏板画得很好
警报(“在displayCurrentHit之后立即停止”);
})
} 
//调用asyncFunc:阻塞???
asyncFunc(HitCurrent).then(console.log('callasync function'));
//证明asyncFunc调用的异步性
警报('asynFunc().then');
}
asyncFunc的调用未阻塞。如果有人能给出一种方法,使用
Promise
概念以同步方式显示当前游戏板


关于

您在解决您的承诺时使用了错误的语法

。然后
在中接受函数回调,在解析承诺时调用

因此,在您的情况下,此代码:

// Call asyncFunc : blocking ???
asyncFunc(HitCurrent).then(console.log('Call async function'));
// Prove asynchronuous of asyncFunc call
alert('after asynFunc().then');
应该是:

asyncFunc(HitCurrent).then(() => alert('after asynFunc()'));
相反,为了以“同步方式”编写代码,您可以通过以下方式使用
async/await

函数asyncFunc(当前){
//回报承诺
返回新承诺(解决=>{
setTimeout(()=>resolve('finished'),1000);
})。然后(数据=>{
警报(“承诺已解决:”+数据);
})
}
(异步()=>{
等待asyncFunc();
警报('asynFunc().then');

})();您可以考虑在编写代码时使用一致的缩进-它将使读和调试变得更容易,不仅对于潜在的回答者,而且对您来说,当我们都可以看到<代码> {<代码> >代码> } /代码>块和它们的嵌套级别一览。对不起,我只知道缩进代码的快捷键CTRL+K。
async
函数不阻塞。
。然后(console.log('Call async function'))
希望函数作为参数调用。您要做的是立即调用
console.log('Call async function')
,并将结果(
undefined
)传递给
。然后()
您真的在每个游戏动作中实例化一个新的webworker吗?没有破坏它吗?好的,谢谢!我要试试你的解决办法。但是为什么-@Patrick Roberts告诉我在我的情况下这是不可能的呢?Regardi认为他理解您不希望简单地编写代码,就像它看起来是同步的,但您确实希望代码在操作系统级别同步执行。但也许问他是最好的办法:)好吧,一切如期!真的谢谢。如果我已经很好地理解了,我们可以通过使用
(async)
和wait
asyncFunc
:因此部分
(async()=>{wait asyncFunc();alert('after asynFunc().then');})可以绕过这个问题正在阻塞,我的意思是,等待所有
asyncFunc
函数的执行,不是吗?
asyncFunc(HitCurrent).then(() => alert('after asynFunc()'));