【发布时间】:2020-08-12 02:27:19
【问题描述】:
很抱歉无法提供工作代码,但也许很愚蠢,我有一个函数调用函数的世界,还有两个对外部 astar 路径查找器脚本的调用。我一直在移动等待的实例,.then 并解决了几天和几天,我只是无法让movePlayer(journeyPart2) 等到await movePlayer(journeyPart1) 完成。我也看过无数关于承诺的视频,但我看不出我哪里出错了。我还尝试仅在 for 循环到达其最后一个实例时才返回某些内容,但这不起作用。我真的希望这对我出错的人来说是显而易见的。不幸的是,第二个 movePlayer 函数需要不同的时间才能完成,所以我不能单独使用设置的时间间隔来对第二个 movePlayer 函数进行排队。
我实际上不需要从movePlayer 函数返回任何数据,但我知道至少必须返回承诺。如何让第二个movePlayer 函数等待?
编辑:请注意 else if 工作正常,因为 movePlayer 只被调用一次。
function movePlayer(journey) {
return new Promise((resolve, reject) => {
for (let i = 0; i < journey.length; i++){
(function(i){
window.setTimeout(function(){
let nextX = journey[i].y;//?SWITCHED X AND Y AS ASTAR SWITCHES IN GRAPH
let nextY = journey[i].x;//?SWITCHED X AND Y AS ASTAR SWITCHES IN GRAPH
let fromTop = (26 + (nextX * 16) + (nextY * 16)) + "px";
let fromLeft = (576 + (nextX * 32) - (nextY * 32)) + "px";
document.getElementById("playerLayer").style.left = fromLeft;
document.getElementById("playerLayer").style.top = fromTop;
}, i * (900));
}(i));
}
resolve("complete")
reject("failure")
})
}
function globalPathFindANDMove(cellNumEnd, levelNumEnd) {
let cellNumStart = playerInfo.cellNow;
let levelNumStart = playerInfo.levelNow;
let j1Complete = false;
if (levelNumStart != levelNumEnd) {
(async function(){
try {
let journeyPart1 = await localPathFind(cellNumStart, undefined, levelNumStart)
let journeyPart2 = await localPathFind(undefined, cellNumEnd, levelNumEnd)
let useless = await movePlayer(journeyPart1)
console.log(useless)
movePlayer(journeyPart2)//this function won't wait until the function above completes
//------------------------------------------------------changePlayerLevel (levelNumEnd);-----------------------CREATE LATER
} catch (err) {
}
})();
} else if (levelNumStart == levelNumEnd) {
let journey = localPathFind(cellNumStart, cellNumEnd, levelNumEnd);
movePlayer(journey);
}
}
【问题讨论】:
-
尝试替换自调用函数,用普通函数替换。就我的经验而言,异步自调用函数不能正常工作。
-
movePlayer没有任何异步;它将运行setTimeoutjourney.length次并立即解决。