Я запускаю веб-работника (вычисляя попадание в игру) в обещание, и я хотел бы получить результаты (всегда массив), как только веб-работник завершит свои вычисления.
Я пытался наконец обещания, чтобы вернуть объект после then(
и сделать в основном потоке:
(async () => {
// Wait computeHit function
await computeHit(HitCurrent, 'computer');
Но кажется, что когда вычисления, выполняемые с помощью computeHit
, высоки, между return HitCurrent
возникают конфликты изpromise
и опция HitCurrent = 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');
), и это, как только веб-работник получит свои результаты (значение и объект 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
, не так ли?
На данный момент, для легких вычислений для веб-работника, решение, приведенное в разделе кода этого поста, работает нормально, но как только я получаю высокие вычисления для веб-работника, код завершает саму игру, безбольше взаимодействий для попадания пользователя (что я делаю с помощью щелчка мыши на игровом поле).
Итак, я хотел бы получить советы, чтобы вернуть объект HitCurrent
из блока Promise
во всех случаях, длялегкий и высокий расчет веб-работника.