我启动了一个网络工作人员(将游戏的命中率计算)成一个承诺,一旦网络工作人员完成计算,我想取回结果(总是一个数组)。

在promise的结尾,我尝试在then(之后返回对象并在主线程中执行操作:

(async () => {
    // Wait computeHit function
    await computeHit(HitCurrent, 'computer');


但是,似乎当computeHit完成的计算量很高时,return HitCurrentpromiseHitCurrent = await块中的(async () =>选项之间就会发生冲突。

下面的代码更加清楚:

背景包括:

1)使用webworker

2)使用诺言

3)async / await关键字

承诺块:

function computeHit(HitCurrent, mode) {

if (mode == 'computer') {

let HitTemp = JSON.parse(JSON.stringify(HitCurrent));

return new Promise( resolve => {
       // Creation of webworker
       firstWorker = new Worker(workerScript);
       firstWorker.onmessage = function (event) {
       resolve(event.data);
}

// Post current copy of HitCurrent, i.e HitCurrent
firstWorker.postMessage([HitTemp, HitTemp.playerCurrent, maxNodes]);
}).then(({result}) => {

// Get back game board of webworker
HitTemp = result.HitResult;

// Get back suggested hit computed by webworker
[a,b] = HitTemp.coordPlayable;

// Drawing all lines from suggested hit (in 8 directions)
// HERE, we modify HitCurrent attributes (like array)
for (k = 0; k < 8; k++) {
  exploreHitLine(HitCurrent, a, b, k, 'drawing');
}

// Remove playable hits
cleanHits('playable', HitCurrent);

// Display current game
displayCurrentHit(HitCurrent);

// Return object HitCurrent
return HitCurrent;
})}
}


上面等待承诺的异步块是:

(async () => {
      // Wait computeHit function and update HitCurrent when promise is done
      HitCurrent = await computeHit(HitCurrent, 'computer');
      // Reset, switch and update
      resetSwitchUpdate(HitCurrent, false);
})();


我想获取更新的HitCurrent对象(如我对exploreHitLine(HitCurrent, a, b, k, 'drawing');所说的那样修改),并且一旦webworker收到其结果(一个值和一个对象HitResult),就可以这样做。

我不知道如何使await computeHit(HitCurrent, 'computer');的行为以及我将Promise末尾应用的返回值,即:

return HitCurrent;

什么是更正解决方案? :

1)在做:

(async () => { // Wait computeHit function and update HitCurrent when promise is done await computeHit(HitCurrent, 'computer');

与成Promise

return HitCurrent;

2)在做:

(async () => { // Wait computeHit function and update HitCurrent when promise is done Object = await computeHit(HitCurrent, 'computer');

与成Promise

return HitCurrent;



对于2)的情况,如果这是解决方案,如何从局部变量Hitcurrent取回Object对象?我看到结果可能是包装器。

我认为重要的一点是,返回承诺不同于返回HitCurrent之类的对象,不是吗?

目前,对于Webworker中的轻量级计算,本文代码部分中给出的解决方案可以正常工作,但是,一旦我对Webworker进行了高计算量,代码便会终止游戏本身,而无需用户点击进行任何交互(即我用鼠标单击游戏板上做)。

因此,我希望获得建议,以便在所有情况下都从HitCurrent块取回对象Promise,以减轻Webworker的工作量并提高计算效率。

最佳答案

好的,看完演示后,我想我知道它可能会损坏的原因。

对于游戏模式(用户/计算机等),您具有具有多种情况的currentGame函数,对于计算机模式,您正在调用该函数以返回promise。问题在于,promise封装在立即调用的函数中,这意味着其下面的代码不会等待并继续执行。

只是为了说明我的意思,这里有个例子:

var testPriomise = () => new Promise(resolve => { resolve(2)})

console.log('1');
(async() => {
    var result = await testPriomise();
    console.log(result)
})()

console.log('Look! I fire before 2!', 3)


如果您在控制台中运行它,您会注意到它记录1、3,然后才记录2。
我希望你能看到我要去的地方:)

进行以下几项更改:
代替

// Main game function : started with white player
function currentGame(HitCurrent) {




// Main game function : started with white player
async function currentGame(HitCurrent) {


对于您的计算机模式,请执行以下操作:

// Play computer hit
   else {
    // First option : Wait computeHit function
    await computeHit(HitCurrent, 'computer');

    // Reset, switch and update
    resetSwitchUpdate(HitCurrent, false);
   }


这样,您可以确保resetSwitchUpdate已更新HitCurrent对象。

我希望这会解决它!

09-20 07:19