1

我有一个具有以下结构的代码。基本上我的要求是“SELECT”f5中选项的onChange应该在f1之后运行。在 f1 内部 - 首先 f2 必须运行,完成后 f3 必须运行。f2 的完成意味着它还必须确保 f4 运行并完成。我的意思是保持流程,因为如果一些要早点完成的功能被抛在后面,那么我的整个程序就会变得浪费。我猜 deferred 有解决方案,因此我尝试将它与管道一起使用。但由于我不精通维持这种流程,我无法获得预期的结果。如果可以的话请帮忙。

<script>
function f1(){
   function f2(){
      ....
      f4();
      ....
   }
   function f3(){
      ....
   }
}

function f4(){}
function f5(){}
</script>
 ....
<select onChange=f5().pipe(f1) >
......
</select>
4

3 回答 3

2

编辑:您似乎在函数中使用了 $.ajax 。如果您希望在 AJAX 查询完成后运行某些内容,您可以将其设置为在查询返回时运行的回调。例如,您可以根据其他函数定义 f2,如下所示:

function f2()
{
    g();
    f4();
    h();
}

如果 f4 使用 AJAX,您可以按如下方式更改定义:

function f2()
{
    g();
    f4();
}
function f4()
{
    $.ajax("http://url.com").done(function(){
            h();
            f3();
        });
}

done()函数允许您设置一个函数(在本例中为匿名函数)以在成功返回查询后立即执行。以这种方式定义 f2 后,您不再需要 f1,因此您可以定义另一个函数

function f6()
{
    f5();
    f2();
}

然后您可以将 onChange 事件更改为

<select onChange="f6()"></select>

另请注意,正如 mattmanser 发布的那样,此代码:function f(){}仅定义一个函数,它不运行它。如果您希望函数在定义后立即执行,则可以使用闭包代替。

(function f ()
{

})()
于 2013-01-15T11:06:09.970 回答
0

您混淆了函数声明和函数运行。声明函数的顺序无关紧要,只需调用它们的顺序即可。声明:

function a() {
    console.log("a");
}

function c() {
    console.log("c");
}

function b() {
    console.log("b");
}

function runAll() {
    a();
    b();
    c();
}

a(); //will print a
runAll(); //will print a b c on different lines

Javascript 也不是异步的,除非你做了,调用函数是阻塞的,在你的函数完成之前程序执行不会继续。在上面的示例中,直到完成运行才会运行runAlla

唯一的例外是调用一些异步 jQuery 代码,比如 jQuery.ajax。

于 2013-01-15T11:00:38.560 回答
0

好吧,这将很难完全实现。正如 mattmanser 已经写的那样,函数声明确保所有函数都将被顺序调用。您的问题不清楚的是中间是否会有任何 I/O 回调。假设,在 f2 中,您使用 $.get 从您的站点获取某个 HTML 页面。如果您在该调用下有任何其他代码,这将与您的 fetch 并行运行......除非您将此代码打包到 $.get 成功回调中。所以理论上,javascript中的每个函数调用都会被顺序调用,但是回调机制并不能保证东西也不会被并行执行。

于 2013-01-15T11:06:54.550 回答