Функция Javascript выполняется асинхронно, без моего желания - PullRequest
0 голосов
/ 08 декабря 2018

Я делаю навигационное веб-приложение для школьного проекта.Для поиска пути используется программа «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 голосов
/ 08 декабря 2018

Поскольку EasyPath работает асинхронно, вы не можете быть уверены, когда будет выполнена функция, которую вы передаете 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() и вызываете его в функции обратного вызова findPath().

Обещания помогут в дальнейшей очистке этого кода, но, поскольку я незнаком с EasyPath, яя не уверен, что он их поддерживает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...