Javascript函数异步执行,不需要我执行

时间:2018-12-08 16:56:20

标签: javascript asynchronous synchronization

我正在为学校项目制作导航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的值了。该解决方案的问题在于,我无法在整个文档中都这样做,因为它会变得非常混乱,我甚至不确定它是否可以作为永久解决方案。

1 个答案:

答案 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,因此不确定它是否支持它们。