所以,我有一个名为delayed1的延迟函数,每次cond1为真时都会重复,问题是,在delayed1函数do_something1()内部调用,如果cond3为真,则调用另一个名为delayed2的延迟函数。 现在问题是我想要delayed1等到delayed2完成(这意味着直到cond2为假)然后再次恢复,这似乎没有发生。一旦delayed2开始,delayed1不会等待它完成然后恢复。有没有办法做到这一点?希望我足够清楚......
function delayed2() {
setTimeout(function () {
do_something2();
if ( cond2 ) {
delayed2();
}
}, 1000)
}
function do_something1(){
if ( cond3 ){
delayed2();
}
else {
something_else();
}
}
function delayed1() {
does_something_here();
setTimeout(function () {
do_something1();
if ( cond1 ){
delayed1();
}
}, 1000)
}
答案 0 :(得分:3)
我看到你在这里想做什么。您可能希望以不同的方式接近。最好的方法是使用promises或Deferreds。
以下是使用给定代码的jquery延迟的示例。
var wait_a_second = $.Deffered();
$.when(wait_a_second)
.then(does_something_here)
.then(function(){
if( cond1 ) delayed1();
})
.then(delayed1);
function delayed1(){
var d = $.Deffered()
// Your conditions and logic
if( cond ) {
d.resolve();
}
return d.promise();
}
function delayed2(){
var d = $.Deffered();
// Your conditions and logic
if( cond ) {
d.resolve();
}
return d.promise();
}
简而言之,学习管理异步操作队列的承诺。
答案 1 :(得分:2)
您应该使用promises在JS中实现同步执行。
Promise是一种返回可以挂钩回调的对象的机制。一旦执行特定功能,就可以调用这些回调。以下是它适用于您的情况。
您通常有3个相互依赖的功能。第一个应该等待第二个,第二个应该等待第三个。在第一级,第二个函数应返回Promise
。
function delayed1() {
does_something_here();
setTimeout(function () {
var promise = do_something1();
promise.then(function(){
if ( cond1 ){
delayed1();
}
});
}, 1000)
}
这是你的第二个功能。它创造了一个承诺并将其返回。在if ( cond3 )
内部,它应该等待第三个函数的承诺。我不打算写第三个函数,因为我确信你可以按照这个模式自己做。
function do_something1(){
return new Promise(function(resolve){
if ( cond3 ){
var promise = delayed(2);
promise.then(function(){
resolve()
})
}
else {
something_else();
resolve();
}
})
}
答案 2 :(得分:1)
您可以尝试使用回调。以下是一个基本的表示:
var count = 0;
function delay1(callback) {
setTimeout(function() {
console.log("Delay 1");
count++;
if (count < 12) {
if (count % 2 == 0) {
delay1();
} else {
delay2()
}
}
if (callback) {
callback();
}
}, 1000);
}
function delay2(callback) {
setTimeout(function() {
console.log("Delay 2");
if (count > 10) {
delay1(function() {
console.log("This is callback;")
})
} else if (count % 2 == 0) {
delay2();
} else {
delay1()
}
if (callback) {
callback();
}
count++;
}, 1000);
}
delay1();
&#13;