У меня проблема с двумя версиями фрагмента кода, которые, как ожидается, будут делать то же самое: одна с классическим подходом (без веб-разработчика) и вторая с веб-разработчиком.Игра работает нормально с версией без веб-работы:
Ссылка игры 5 : игра без веб-разработчиков
И источник javascript: 8 : скрипт без веб-работников
Я хотел бы заставить работать версию для веб-работников.К сожалению, после того, как компьютер готов, рисование новых дел становится проблематичным: дело (2,3) = (столбец, строка) стирается, и я не могу знать, почему.
Следующая ссылка - веб-работникверсия:
Ссылка на игру 6 : игра с веб-мастерами
И источник javascript: 9 : скрипт с веб-мастерами
Я думаю, что существуют конфликты между областью локальных и глобальных переменных, так как случай (2,3) удаляется при первом обращении к компьютеру.
Относительно версии веб-рабочегоЯ думаю, что соответствующая часть здесь:
else if (mode == 'computer') {
// Local variable as copy of current game board, i.e copy of HitCurrent
let HitTemp = JSON.parse(JSON.stringify(HitCurrent));
// Promise
new Promise( resolve => {
// Creation of webworker
let firstWorker = new Worker(workerScript);
firstWorker.onmessage = function (event) {
resolve(event.data);
}
// Post current copy of HitCurrent, i.e HitTemp
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)
for (k = 0; k < 8; k++) {
exploreHitLine(HitTemp, a, b, k, 'drawing');
}
// Update the global current game board (HitCurrent) from local game board (HitTemp)
HitCurrent = HitTemp;
// Remove playable hits
cleanHits('playable', HitCurrent);
// Display current game
displayCurrentHit(HitCurrent);
// Up to there, first computer hit is good
// and game board is well drawn
alert('Stop just after displayCurrentHit');
// After this above alert, the case (2,3) is deleted
// from the game board : Is "HitCurrent" modified
// once promise is done, i.e outside the promise ??
});`
// Prove asynchronous of new promise call
alert('Here : after new promise call - prove asynchronous call into block "mode = computer"');
}
Для первого попадания в компьютер я ожидаю иметь линию из 3 черных корпусов (от (2,3) до (4,3)случаи (см. рисунок ниже), но, как я уже сказал, случай (2,3) удаляется, когда я отображаю объект currentHit
(описывающий текущее состояние игры и играбельные хиты).
1) Исходное состояние игры для воспроизведения ошибки: вам нужно взять глубина = 1 и нажать на компuter black перед нажатием запустите игру
2) Ожидается игровая доска:
:
3) Дело (2,3) удалено после alert
:
ОБНОВЛЕНИЕ 1: Я думаю, что у меня есть первые элементы ответа.
Функция (названная "computeHit
"), которая содержит блок кода, который я дал выше, вызывается из другой функции, подобной этой:
computeHit(Hit, 'computer');
alert('here after call of computeHit');
, и при выполнении я получаюэто alert
после вызова computeHit
, подтверждающее, что вызов обещания является асинхронным.
Так что я не знаю, чтобы заблокировать часть кода (else if (mode == 'computer') { ...}
).
МожетЯ делаю кодовую блокировку (с promise
) до тех пор, пока веб-работник выполнил свои вычисления (чтобы рассчитать наилучшее рекомендуемое попадание компьютера)?
Я немного растерялся и путаюсь междуОбещание, веб-работник и блокировка части кода, любая помощь или советы были бы хорошими.