Обработка асинхронной функции с веб-работником и обещанием - PullRequest
0 голосов
/ 31 декабря 2018

Я пытаюсь обработать возврат обещания, чтобы получить блокирующее поведение при вызове asyncFunc, определенного в фрагменте кода ниже.В этой функции я использую веб-работника.

Я не специалист по javascript, и концепция обещания является новой для меня.Я попытался определить функцию asyncFunc в блоке моего кода.Если я вызываю эту функцию после, у меня обычно должен быть полностью выполнен код внутри asyncFunc (но я не уверен).

Цель состоит в том, чтобы нарисовать холст (который в настоящее время представляет игровую доску) один раз веб-работник получил массив для рисования (HitCurrentvariable) здесь, т.е. синхронно (функция рисования выполняется displayCurrentHit(HitCurrent);)

else if (mode == 'computer') {
    // Call asynchronous function with promise
    function asyncFunc(HitCurrent) {
        // Return promise
        return 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 HitCurrent
            firstWorker.postMessage([HitCurrent, HitCurrent.playerCurrent, maxNodes]);
        }).then(({result}) => {
            // Get back game board of webworker
            HitCurrent = result.HitResult;
            // Get back suggested hit computed by webworker
            [a,b] = HitCurrent.coordPlayable;
            console.log('Into promise : coordPlayable : (a,b) = ',a,b);
            // Drawing all lines from suggested hit (in 8 directions)
            for (k = 0; k < 8; k++) {
               exploreHitLine(HitCurrent, a, b, k, 'drawing');
            }   
            // 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');
        })
    } 
    // Call asyncFunc : blocking ???
    asyncFunc(HitCurrent).then(console.log('Call async function'));
    // Prove asynchronuous of asyncFunc call
    alert('after asynFunc().then');
}

Вызов asyncFunc не блокируется.Если бы кто-то мог дать метод для отображения текущей игровой доски синхронно, используя концепцию Promise?

С уважением

1 Ответ

0 голосов
/ 31 декабря 2018

У вас неправильный синтаксис, разрешающий ваше обещание.

.then принимает функцию обратного вызова внутри, вызываемую, когда обещание будет выполнено.

Так что в вашем случае этот код:

// 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 следующим образом:

function asyncFunc(HitCurrent) {
  // Return promise
  return new Promise(resolve => {
    setTimeout(() => resolve('finished'), 1000);
  }).then(data => {
    alert('promise resolved:' + data);
  })
}

(async () => {
  await asyncFunc();
  alert('after asynFunc().then');
})();

Итак, вы создаете асинхронную функцию, которая ожидает разрешения вашего обещания, а затем оповещает о значениях.

...