我有两个功能
function f1() {
}
function f2() {
}
我想在f1()和f2()完成时调用fend()
我正在寻找与其有关的“干净”解决方案。当时或承诺功能。
答案 0 :(得分:1)
您可以做以下事情:
var state = 0;
function f1() {
//Do something
state++;
fend();
}
function f2() {
//Do something
state++;
fend();
}
function fend() {
if (state == 2) {
console.log("fend called");
state = 0; //reset the state value
}
}
当每个函数结束时增加一个var,然后调用fend()。如果状态为2,则表示已执行了2个函数。
答案 1 :(得分:1)
是使用deferred object并解决它们。一旦延迟解决,就使用jQuery when来触发回调。
https://jsfiddle.net/v9o7ry8a/2/
var f1 = function() {
var d = $.Deferred();
// A pretend async call
setTimeout(function() {
d.resolve();
}, 1000);
return d;
},
f2 = function() {
var d = $.Deferred();
d.resolve(); // This function resolves right away but f1 takes a second!
return d;
};
$.when(f1(), f2()).done(function() {
// This is your 'fend' function
alert('hi');
});
如果可能发生故障,您还应该处理故障等。如果您希望从.resolve
功能中的f1
或f2
访问数据,也可以使用参数调用fend
。
答案 2 :(得分:0)
我认为你可以这样做:
var check = false;
function f1(){
if(check == true)
fend();
else
check = true;
}
function f2(){
if(check == true)
fend();
else
check = true;
}
当两个功能第一个功能都完成时,检查将为真。 当第二次完成时,将会被召唤。
希望有所帮助
答案 3 :(得分:0)
这不仅限于jQuery,它只是JavaScript,但每次都可以测试一个布尔值。在任一函数的末尾,布尔值将设置为true:
var didEitherFunctionFinish = false;
function f1() {
// f1()'s logic goes here
if(didEitherFunctionFinish) {
finalFunction();
}
didEitherFunctionFinish = true;
}
function f2() {
// f2()'s logic goes here
if(didEitherFunctionFinish) {
finalFunction();
}
didEitherFunctionFinish = true;
}
function finalFunction() {
// what happens after both f1() and f2() have been called
}
布尔值从false开始。在f1()或f2()的末尾,无论如何都设置为true。在此之前,运行测试以查看是否已完成任一功能。如果有,则调用finalFunction()。