我有两个函数,当其他函数(一个和两个)完成时,我想调用第三个函数。 我需要第一个函数和第二个函数称为异步。 例如
var func1 = function( do something..... return arr )
var func2 = function ( do something ..... return arr2 )
if ( arr.length > 0 && arr2.length > 0 )
var func3 = function( do something )
my qeustions:
最好的方法是什么?
我如何以异步方式调用函数?
答案 0 :(得分:4)
如果你有jQuery,你可以使用他们的Deferred
objects:
var func1 = function () {
var dfd = $.Deferred();
setTimeout(function () {
// do your processing
dfd.resolve(arr1);
}, 0);
return dfd.promise();
};
var func2 = function () {
var dfd = $.Deferred();
setTimeout(function () {
// do your processing
dfd.resolve(arr2);
}, 0);
return dfd.promise();
};
$.when(func1(), func2()).then(function (arr1, arr2) {
if ( arr.length > 0 && arr2.length > 0 ) {
func3();
}
});
相关问题:
答案 1 :(得分:0)
var arr1 = [], arr2 = [];
function arraysAreReady() {
if(arr1.length && arr2.length) {
func3();
}
}
var func1 = function() {
var localArray = [];
/// create the local array
arr1 = localArray;
arraysAreReady();
}
var func2 = function() {
var localArray = [];
/// create the local array
arr2 = localArray;
arraysAreReady();
}
func1(); funct2();
当func1创建了第一个数组时,它会将它分配给全局变量arr1并调用arraysAreReady()函数。当func2创建了第二个数组时,它将把它指向全局变量arr2并调用arraysAreReady()。
如果2个全局数组不为空,则arraysAreReady()函数会检查每个调用。它们不是它将调用第三个函数(func3)
答案 2 :(得分:0)
将func3函数作为回调传递,如果两个数组都已填满,则检查回调内部。
var func1 = function(callback) ( do something; callback();..... return arr );
var func2 = function(callback) ( do something; callback(); ..... return arr2 );
var func3 = function() {
if(arr != undefined && arr2 != undefined){
//do stuff
}
};
func1(func3);
func2(func3);
答案 3 :(得分:0)
如果您的程序逻辑合适,您可以通过执行部分处理并使用setTimeout()函数模仿javascript中的异步行为,如下所示:
var result1 = []
var result1Ready = false;
var result2 = []
var result2Ready = false;
func1 = function(list, start, end) {
if(start>=end) {
result1Ready = true;
}
else {
partialEnd = start+10>end ? end : start+10;
for(i=start;i<partialEnd;i++) {
//process 10 items
//append results to array result1
}
//schedule second partial process
setTimeout(function () { func1(list, partialEnd, end); }, 50);
}
};
func2 = function(list, start, end) {
//similar to func1...
};
waitResults = function() {
if(result1Ready && result2Ready) {
func3();
}
else {
setTimeout(function () { waitResults(); }, 50);
}
};
setTimeout(function () { func1(someList, 0, listLength); }, 5);
setTimeout(function () { func2(someOtherList, 0, otherListLength); }, 5);
setTimeout(function () { waitResults(); }, 10);