如何在两个函数之间同步

3

我有两个函数,当另外两个函数(one和two)完成后,我希望将它们一起调用到第三个函数中。我需要确保第一个和第二个函数是异步的。

例如:
  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 )

我的问题:

  1. 最佳方法是什么?

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


你想在执行第一和第二个函数后调用第三个函数吗? - Vlad Balmos
是的,但我希望第一个函数和第二个函数以异步方式被调用。 - user1365697
“异步方式”是什么意思? - Vlad Balmos
我的意思是我调用func1,但我不知道函数何时完成,而且func2可能会在第一个函数之前完成。只有当我拥有arr和arr2的数据时,我才需要调用func3。 - user1365697
我不想同步调用,也就是先调用func1并获取结果,然后再调用func2并获取结果。因为我不知道函数何时会完成。 - user1365697
如果你正在开发一个NodeJS项目,我建议你研究一下Iced CoffeeScript - Gautham Badhrinathan
4个回答

5
如果您使用jQuery,您可以使用它们的Deferred对象
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();
    }
});

相关问题:


是的,DeferredPromise非常棒! - Gautham Badhrinathan

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()。

arraysAreReady()函数在每次调用时检查两个全局数组是否为空。如果它们不是空的,则会调用第三个函数(func3)。


但问题是,我不知道func1和func2何时会完成,我希望这些函数被异步调用,所以我不知道arr和arr2何时会有数据。 - user1365697
只有当两个函数都完成时,我才能使用func3。 - user1365697

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接