Javascript: 在另一个延迟函数中调用一个延迟函数
Javascript: Calling a delayed function inside another delayed function
所以,我有一个称为 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)
}
您可以尝试使用回调。以下是基本表示:
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();
我明白你想在这里做什么。您可能希望以不同的方式进行处理。最好的方法是使用 promises or 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();
}
简而言之,学习管理异步操作队列的承诺。
你应该使用promises在JS中实现同步执行
Promise 是一种机制,它 return 是一个您可以挂钩回调的对象。一旦特定函数执行完毕,就可以调用这些回调。以下是它如何适用于您的情况。
你通常有 3 个相互依赖的函数。第一个应该等第二个,第二个应该等第三个。在第一级中,第二个函数应该 return a Promise
.
function delayed1() {
does_something_here();
setTimeout(function () {
var promise = do_something1();
promise.then(function(){
if ( cond1 ){
delayed1();
}
});
}, 1000)
}
这是您的第二个函数。它创建了一个承诺并 return 实现了它。同样在其 if ( cond3 )
内部,它应该等待第三个函数的承诺。我不会编写您的第三个函数,因为我确定您可以按照此模式自己完成。
function do_something1(){
return new Promise(function(resolve){
if ( cond3 ){
var promise = delayed(2);
promise.then(function(){
resolve()
})
}
else {
something_else();
resolve();
}
})
}
所以,我有一个称为 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)
}
您可以尝试使用回调。以下是基本表示:
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();
我明白你想在这里做什么。您可能希望以不同的方式进行处理。最好的方法是使用 promises or 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();
}
简而言之,学习管理异步操作队列的承诺。
你应该使用promises在JS中实现同步执行
Promise 是一种机制,它 return 是一个您可以挂钩回调的对象。一旦特定函数执行完毕,就可以调用这些回调。以下是它如何适用于您的情况。
你通常有 3 个相互依赖的函数。第一个应该等第二个,第二个应该等第三个。在第一级中,第二个函数应该 return a Promise
.
function delayed1() {
does_something_here();
setTimeout(function () {
var promise = do_something1();
promise.then(function(){
if ( cond1 ){
delayed1();
}
});
}, 1000)
}
这是您的第二个函数。它创建了一个承诺并 return 实现了它。同样在其 if ( cond3 )
内部,它应该等待第三个函数的承诺。我不会编写您的第三个函数,因为我确定您可以按照此模式自己完成。
function do_something1(){
return new Promise(function(resolve){
if ( cond3 ){
var promise = delayed(2);
promise.then(function(){
resolve()
})
}
else {
something_else();
resolve();
}
})
}