これは、stackoverflow に関する私の最初の投稿です。もし私が全くの愚痴のように出くわしたり、自分自身を完全に明確にすることができなくても、あまり激しく非難しないでください。:-)
これが私の問題です。最初の関数の完了を確認してから2番目の関数を実行することにより、2つの関数を別の関数に「結び付ける」javascript関数を作成しようとしています。
これに対する簡単な解決策は、スコープ内で両方の関数を呼び出すメタ関数を作成することです。ただし、最初の関数が非同期 (具体的には AJAX 呼び出し) で、2 番目の関数が最初の関数の結果データを必要とする場合、それはうまくいきません。
解決策の私のアイデアは、最初の関数に「フラグ」を与えることでした。つまり、呼び出されると、パブリックプロパティ「this.trigger」(「0」として初期化され、完了時に「1」に設定) を作成します。そうすることで、別の関数がフラグの値 ([0,1]) をチェックできるようになります。条件が満たされた場合 (「トリガー == 1」)、2 番目の関数が呼び出されます。
以下は、テストに使用した抽象的なサンプル コードです。
<script type="text/javascript" >
/**/function cllFnc(tgt) { //!! first function
this.trigger = 0 ;
var trigger = this.trigger ;
var _tgt = document.getElementById(tgt) ; //!! changes the color of the target div to signalize the function's execution
_tgt.style.background = '#66f' ;
alert('Calling! ...') ;
setTimeout(function() { //!! in place of an AJAX call, duration 5000ms
trigger = 1 ;
},5000) ;
}
/**/function rcvFnc(tgt) { //!! second function that should get called upon the first function's completion
var _tgt = document.getElementById(tgt) ; //!! changes color of the target div to signalize the function's execution
_tgt.style.background = '#f63' ;
alert('... Someone picked up!') ;
}
/**/function callCheck(obj) {
//alert(obj.trigger ) ; //!! correctly returns initial "0"
if(obj.trigger == 1) { //!! here's the problem: trigger never receives change from function on success and thus function two never fires
alert('trigger is one') ;
return true ;
} else if(obj.trigger == 0) {
return false ;
}
}
/**/function tieExc(fncA,fncB,prms) {
if(fncA == 'cllFnc') {
var objA = new cllFnc(prms) ;
alert(typeof objA + '\n' + objA.trigger) ; //!! returns expected values "object" and "0"
}
//room for more case definitions
var myItv = window.setInterval(function() {
document.getElementById(prms).innerHTML = new Date() ; //!! displays date in target div to signalize the interval increments
var myCallCheck = new callCheck(objA) ;
if( myCallCheck == true ) {
if(fncB == 'rcvFnc') {
var objB = new rcvFnc(prms) ;
}
//room for more case definitions
window.clearInterval(myItv) ;
} else if( myCallCheck == false ) {
return ;
}
},500) ;
}
</script>
テスト用の HTML 部分:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/strict.dtd >
<html>
<head>
<script type="text/javascript" >
<!-- see above -->
</script>
<title>
Test page
</title>
</head>
<body>
<!-- !! testing area -->
<div id='target' style='float:left ; height:6em ; width:8em ; padding:0.1em 0 0 0; font-size:5em ; text-align:center ; font-weight:bold ; color:#eee ; background:#fff;border:0.1em solid #555 ; -webkit-border-radius:0.5em ;' >
Test Div
</div>
<div style="float:left;" >
<input type="button" value="tie calls" onmousedown="tieExc('cllFnc','rcvFnc','target') ;" />
</div>
<body>
</html>
トリガーが正しく「1」に設定されているかどうかを確認したので、これはjavascriptスコープの問題であると確信しています。「checkCall()」関数は更新されたオブジェクトを受信せず、その古いインスタンスのみをチェックする可能性が非常に高く、「this.trigger」を「1」に設定することによって完了のフラグを立てることはありません。もしそうなら、私はその問題に対処する方法がわかりません。
とにかく、誰かがこの特定の問題に関するアイデアや経験を持っていることを願っています.
読んでくれてありがとう!
FK