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を介してこれを達成する方法はありますか?
私の意見では、(あなたが言及したように)遅延/約束は、タイムアウトを使用するのではなく、進むべき方法です。
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();
}
これを行うには、いくつかの方法が考えられます。
コールバックを使用します。
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
}
次の回答は、これと同期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);
}
});
}