2013-03-26 64 views
1

我知道这个主题有很多问题,但是它们都是针对特定情况而定制的。我正在问这个问题,并希望每个人都能在调查这个问题时使用一个答案。对JavaScript执行顺序的正确解释

说我有三个功能需要按顺序执行,他们都做一些异步。

两种功能是一个回调简单:

var fOne = function(callback) { 
    // do stuff 
    callback(); 
}; 

var fTwo = function() { 
    // do stuff 
}; 

呼叫:

fOne(fTwo); 

使fTwo FONE完成后运行。如何将fThree添加到这种情况下,以便在fTwo之后运行,并在fOne之后运行?

+0

当你想fThree执行 – Huangism 2013-03-26 18:19:04

+1

这有什么好做的jQuery依赖。 – 0x499602D2 2013-03-26 18:20:25

+0

相应编辑我的问题 – Difusio 2013-03-26 18:20:29

回答

2

基本上,如果我理解你的问题是正确的,你需要传递一个lambda到fOne以便能够向fTwo添加参数,然后让fTwo收集回调并像fOne那样调用它。

var fOne = function(callback) { 
    // do stuff 
    callback(); 
}; 

var fTwo = function(callback) { 
    // do stuff 
    callback(); 
}; 

var fThree = function() { 
    // do stuff 
}; 

fOne(function() { fTwo(fThree); }); // <- lambda 
1

既然你不使用延迟,并承诺同时运行asyncronous行动,而是刚刚开始一个当对方已经完成,增加了第三那张几乎相同的方式:

var fOne = function(callback) { 
    console.log('1') 
    callback(); 
}; 

var fTwo = function(callback) { 
    console.log('2') 
    callback(); 
}; 

var fThree = function() { 
    console.log('3') 
}; 

fOne(function() { 
    fTwo(function() { 
     fThree(); 
    }); 
}); 

FIDDLE

+1

这仍然没有给我正确的结果,会使用延迟是一个更好的选择? – Difusio 2013-03-26 18:29:57

+0

它以完美的顺序执行功能,你期望得到什么结果? – adeneo 2013-03-26 18:31:52

+0

我想我没有提供足够的信息。 fOne和fTwo都用内容填充iframe。由于登录问题,他们需要一个接一个地做。因此fTwo在fOne的回调中。在fTwo中,我的所有代码都位于.load块中,按下按钮导致第二页。 f三个不能被调用,直到新的负载完成,我开始认为我的问题在那里。 – Difusio 2013-03-26 18:35:45

1

,我想出了一个更办法:

var stack = [fOne, fTwo, fThree]; 
stack.shift()(function() { 
    stack.shift()(stack[0]); 
}); 

如果你定义functins为:

function fOne(callback) { 
    setTimeout(function() { // <-- example of async task 
     alert('fOne done'); 
     callback && callback(); 
    }, 1000); 
} 

http://jsfiddle.net/kRMr8/2/