1

我的设置

function ajaxLoadSth(value, attribute) {

    $.post( url, value, function(response) {

        // interpreting the response
        var foobar = $('#foo') + $('.bar').find('.sth');

        // print interpretation into DOM
        container.append(foobar);

        // do some funky stuff
        doSomeFooWithDom();
        checkSomeBarHere();
        updateSomeValuesThere();

        // now call the function again with different values 

        // THIS IS WHAT MY QUESTION REFERS TO **************
        if ( true ) {
            ajaxLoadSth(newValue, newAttribute);
        }
    });
}

我的问题

该函数不能在// do some funky stuff -part,一些 DOM 操作,完成执行之前调用自己-但它确实如此

我的问题

  • 这是为什么?是因为那些“时髦的东西”位于外部函数中吗?这对同步执行有影响吗?
  • 我怎样才能让“自己调用”等到上面的东西完成?

我已经考虑过通过设置全局变量触发处理程序来告诉它们准备好的函数。每次触发处理程序时,一个函数都会检查所有变量是否设置正确,然后执行函数调用。那个怎么样?

非常感谢您提前抽出时间!

4

2 回答 2

0

尝试回调例如。

doSomeFunkyStuff(callback){
//DO SOME FUNKY
  callback();
}

function ajaxLoadSth(value, attribute) {

    $.post( url, value, function(response) {

        // interpreting the response
        var foobar = $('#foo') + $('.bar').find('.sth');

        // print interpretation into DOM
        container.append(foobar);

        // do some funky stuff
        doSomeFunkyStuff(function(){
           ajaxLoadSth(newValue, newAttribute);
        }

    });
}
于 2013-02-20T18:48:59.803 回答
0
  1. 函数是外部的这一事实并不重要。它们将同步执行:如果您使用 DOM 检查器并在这些函数中放置断点,您应该会发现它们将在 AJaX 调用自行调用之前按顺序执行。

  2. 我认为这里的关键是“等到上面的东西完成”——这些函数将按照你调用它们的顺序执行,但“完成”的结果可能是异步的。

我写了一个插件来处理这种叫做Pendant.js的东西。这个想法是,您希望根据各种依赖关系推迟(a)给定函数的执行:adependency是您传递给 Pendant 的函数,它获取一个额外的参数,resolve,这是一个您可以在依赖项时调用的函数已经满足。然后你将你的递归调用作为 a 传递dependant,它只会在所有 Pendant 的依赖项都已解决时执行。

jQuery 还实现了开箱即用的“ Promises ”,这正是我想要的,但是使用了一种面向 XHR 的语言,这让我感到不舒服。话虽如此,它可能更健壮(并且有据可查!),因此您可能应该看一下。

于 2013-02-20T18:49:01.727 回答