3

他の関数 ( one と two ) が終了するときに、3 番目の関数に呼び出したい 2 つの関数があります。最初の関数と 2 番目の関数を Asynchronous と呼ぶ必要があります。例えば

  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

プログラムロジックが適切な場合は、次のように部分処理を実行し、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 に答える
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
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 が 2 番目の配列を作成すると、それをグローバル変数 arr2 に割り当て、arraysAreReady() を呼び出します。

arraysAreReady() 関数は、2 つのグローバル配列が空でないかどうかを各呼び出しでチェックします。それらは 3 番目の関数 (func3) を呼び出すものではありませんか?

于 2012-08-23T13:38:28.013 に答える