0

我在 Document Ready 上调用了一些 javascript 函数:

fogFields();
getLoS();
getShips();    

startGame();
getNextMove();

然而,好像 getNextMove() 是首先被调用的,很可能它所做的只是一个 ajax 调用并警告结果。所有其他函数都有更多工作,因此,加载时发生的第一件事是 getNextMove() 警报,在后台您可以看到其他函数都没有完成它们的工作。在我单击警报窗口上的确定之前,不会显示任何结果。我可以做到这一点,直到一个功能完成,下一个甚至不会开始。一些函数在完成之前调用自己的额外函数,并且按顺序工作,但我不能用整个代码来做到这一点......

4

3 回答 3

3

鉴于您问题中的代码,无论其内容如何,​​都无法在退出getNextMove之前调用 to 。startGame

startGame调用 之前或之后的任何时间完成异步调度的函数(通过超时、AJAX 回调等)可能是真的getNextMove,但这是一个单独的问题。为了解决这个问题,我们需要更多地了解函数的内容。

于 2013-08-01T20:46:46.237 回答
0

如果其他函数中有一个 AJAX 调用,那么这些 AJAX 调用肯定会带有一个回调参数,这是一个在 AJAX 调用结束时执行的函数。现在,如果你想以某种方式执行你的函数,一个函数在前一个函数的 AJAX 调用完成时启动,你可以为你自己的函数添加一个额外的回调参数,然后将其传递给 AJAX 调用。这应该说明我的意思:

function logFields(callback) {
    ajaxCall(callback);
}

function getLoS(callback) {
    ajaxCall(callback);
}

function getShips(callback) {
    ajaxCall(callback);
}

function startGame(callback) {
    ajaxCall(callback);
}

function getNextMove() {
}

fogFields(function(){
    getLoS(function(){
        getShips(function(){
            startGame(function(){
                getNextMove();
            });
        });
    });
});
于 2013-08-01T21:15:34.337 回答
0

如果您的所有函数都使用 ajax 调用,那么只需使用 Promise。只需返回它,例如:

function fogFields(){
    return $.ajax();
};

然后只需使用.then:

fogFields().then(getLos());

如果您使用它,有关jquery 文档页面上的延迟对象的更多信息。或者在纯 javascript 中实现你可以在这里找到更多的理论在这里
或其他选项,我不建议您将async$.ajax 调用中的参数设置为false. 同样,它适用于您使用 jQuery 的情况。

于 2013-08-01T21:29:20.660 回答