如何在两个函数之间进行同步

时间:2012-08-23 13:32:48

标签: javascript

我有两个函数,当其他函数(一个和两个)完成时,我想调用第三个函数。 我需要第一个函数和第二个函数称为异步。 例如

  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:

  1. 最好的方法是什么?

  2. 我如何以异步方式调用函数?

4 个答案:

答案 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);