Вернуть модифицированный объект из обещания блоку async () - PullRequest
0 голосов
/ 01 января 2019

Я запускаю веб-работника (вычисляя попадание в игру) в обещание, и я хотел бы получить результаты (всегда массив), как только веб-работник завершит свои вычисления.

Я пытался наконец обещания, чтобы вернуть объект после 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 во всех случаях, длялегкий и высокий расчет веб-работника.

1 Ответ

0 голосов
/ 01 января 2019

хорошо, после просмотра демонстрации я думаю, что вижу причину, по которой она может сломаться.

У вас есть функция currentGame с несколькими случаями для режима игры (пользователь / компьютер и т. Д.),а для компьютерного режима вы вызываете ту функцию, которая возвращает обещание.Проблема в том, что обещание заключено в немедленно вызываемую функцию, что означает, что код ниже не ждет и продолжает выполняться.

Просто чтобы проиллюстрировать, что я имею в виду, вот пример для вас:

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) {

do

// 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 объект.

Надеюсь, это все исправит!

...