web-dev-qa-db-ja.com

javascript関数は、別の関数が終了するまで待機します

Androidから呼び出される2つのjavascript関数があります。長いデバッグセッションの後、最初の関数が終了する前に2番目の関数が呼び出されることから問題が生じていることに気付きました。私はすでに遅延などでサンプルを検索しましたが、それらはすべて別のサンプル内の関数呼び出しに依存しています。

function FunctInit(someVarible){ //someVariable is sent from Android, cannot call again from getResult
//init and fill screen
}

function getResult(){ //also getResult need to be called from Android via button
//return some variables
}

GetResultにFuncInitを待機させるにはどうすればよいですか? Javascriptを介してこれを達成する方法はありますか?

12
tugce

私の意見では、(あなたが言及したように)遅延/約束は、タイムアウトを使用するのではなく、進むべき方法です。

example は、遅延/約束を使用してそれを行う方法を示すために書いたばかりです。

遅延オブジェクトをいじるのに時間をかけてください。それらを本当に理解すると、非同期タスクを実行するのが非常に簡単になります。

お役に立てれば!

$(function(){
    function1().done(function(){
        // function1 is done, we can now call function2
        console.log('function1 is done!');

        function2().done(function(){
            //function2 is done
            console.log('function2 is done!');
        });
    });
});

function function1(){
    var dfrd1 = $.Deferred();
    var dfrd2= $.Deferred();

    setTimeout(function(){
        // doing async stuff
        console.log('task 1 in function1 is done!');
        dfrd1.resolve();
    }, 1000);

    setTimeout(function(){
        // doing more async stuff
        console.log('task 2 in function1 is done!');
        dfrd2.resolve();
    }, 750);

    return $.when(dfrd1, dfrd2).done(function(){
        console.log('both tasks in function1 are done');
        // Both asyncs tasks are done
    }).promise();
}

function function2(){
    var dfrd1 = $.Deferred();
    setTimeout(function(){
        // doing async stuff
        console.log('task 1 in function2 is done!');
        dfrd1.resolve();
    }, 2000);
    return dfrd1.promise();
}
40

これを行うには、いくつかの方法が考えられます。

コールバックを使用します。

 function FunctInit(someVarible){
      //init and fill screen
      AndroidCallGetResult();  // Enables Android button.
 }

 function getResult(){ // Called from Android button only after button is enabled
      //return some variables
 }

タイムアウトを使用します(これはおそらく私の好みです):

 var inited = false;
 function FunctInit(someVarible){
      //init and fill screen
      inited = true;
 }

 function getResult(){
      if (inited) {
           //return some variables
      } else {
           setTimeout(getResult, 250);
      }
 }

初期化が発生するまで待ちます:

 var inited = false;
 function FunctInit(someVarible){
      //init and fill screen
      inited = true;
 }

 function getResult(){
      var a = 1;
      do { a=1; }
      while(!inited);
      //return some variables
 }
6
Nicholas

次の回答は、これと同期AJAX call-

動作中

waitForMe().then(function(intentsArr){
  console.log('Finally, I can execute!!!');
},
function(err){
  console.log('This is error message.');
})

function waitForMe(){
    // Returns promise
    console.log('Inside waitForMe');
    return new Promise(function(resolve, reject){
        if(true){ // Try changing to 'false'
            setTimeout(function(){
                console.log('waitForMe\'s function succeeded');
                resolve();
            }, 2500);
        }
        else{
            setTimeout(function(){
                console.log('waitForMe\'s else block failed');
                resolve();
            }, 2500);
        }
    });
}
1