3

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

  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. 我如何以异步方式调用函数?

4

4 回答 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();
    }
});

相关问题:

于 2012-08-23T13:44:37.607 回答
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)吗

于 2012-08-23T13:38:28.013 回答
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);
于 2012-08-23T13:44:26.967 回答
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);
于 2012-08-23T14:07:25.190 回答