使用 webworker 和 promise 处理异步函数
Handling asynchronous function with webworker and promise
我尝试处理 return 的承诺,以便在我调用下面的代码片段中定义的 asyncFunc 时获得阻塞行为。在这个函数中,我使用了一个 webworker。
我不是 JavaScript 方面的专家,promise 的概念对我来说是新的。我试图在我的代码块中定义一个 asyncFunc
函数。如果我之后调用这个函数,我通常应该完全执行 asyncFunc 中的代码(但我不确定)。
目标是在 webworker 收到要绘制的数组后绘制 canvas(当前代表游戏板) (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
概念以同步方式显示当前游戏板?
你的承诺语法错误。
.then
接受一个函数回调,当 promise 将被解析时调用。
因此在您的情况下,此代码:
// 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()'));
为了在 "sync way" 中编写代码,您可以这样使用 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');
})();
因此您创建了一个异步函数,等待您的承诺得到解决,然后提醒值。
我尝试处理 return 的承诺,以便在我调用下面的代码片段中定义的 asyncFunc 时获得阻塞行为。在这个函数中,我使用了一个 webworker。
我不是 JavaScript 方面的专家,promise 的概念对我来说是新的。我试图在我的代码块中定义一个 asyncFunc
函数。如果我之后调用这个函数,我通常应该完全执行 asyncFunc 中的代码(但我不确定)。
目标是在 webworker 收到要绘制的数组后绘制 canvas(当前代表游戏板) (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
概念以同步方式显示当前游戏板?
你的承诺语法错误。
.then
接受一个函数回调,当 promise 将被解析时调用。
因此在您的情况下,此代码:
// 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()'));
为了在 "sync way" 中编写代码,您可以这样使用 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');
})();
因此您创建了一个异步函数,等待您的承诺得到解决,然后提醒值。