我正在为学校项目制作导航Web应用程序。它使用名为“ EasyStar”的程序进行寻路。因为我需要经常计算一些点之间的距离,所以我决定为此做一个函数:
function Distance(A, B, C, D, G) {
easystar.setGrid(G);
easystar.findPath(A, B, C, D, function( path ) {
Dist = 1;
for (F = 0; F < Dist; F++){
if (typeof path[F] !== "undefined"){Dist++;}
else{}
}});
easystar.calculate();
}
我面临的问题是,当我调用该函数时,它在执行下一部分代码后就完成了:如果我在控制台中同时在函数本身的末尾和应该在该函数之后登录Dist,要执行,最终以:
undefined
[The actual distance]
如果我做这样的事情
setTimeout(function(){console.log(Dist)},0.001)
或0.001毫秒的延迟它确实可以正确显示它,并且我可以开始使用Dist的值了。该解决方案的问题在于,我无法在整个文档中都这样做,因为它会变得非常混乱,我甚至不确定它是否可以作为永久解决方案。
答案 0 :(得分:0)
由于EasyPath异步运行,因此您无法确定何时传递给fileName = waitAndReturnUploadedFileName(path);
的函数。因此,任何需要最终值findPath()
的逻辑都必须放置在该函数中。因为这很快就会变得很丑陋,所以您可以将成功回调传递给Dist
,该回调在计算Distance()
之后被调用,就像这样。
Dist
function myFunc() {
var grid = [
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0]
];
Distance(0, 0, 4, 0, grid, handleDist);
};
var handleDist = function(dist) {
// Do something with dist.
};
function Distance(A, B, C, D, G, callback) {
easystar.setGrid(G);
easystar.findPath(A, B, C, D, function(path) {
Dist = 1;
for (F = 0; F < Dist; F++) {
if (typeof path[F] !== null) { Dist++; }
else { }
}
callback(Dist);
});
easystar.calculate();
}
只是如何调用myFunc()
的一个示例。如您所见,Distance()
是一个单独的函数,您将编写该函数来处理handleDist()
的最终值。您将此传递给Dist
并在Distance()
的回调中调用它。
Promises将有助于进一步清理此代码,但是由于我不熟悉EasyPath,因此不确定它是否支持它们。