別の関数が完了した後に関数を実行する方法はありますか? 例えば:
doSomething();
doSomethingElse();
doSomething が完了した後に doSomethingElse() を実行したいだけです。これは可能ですか?
別の関数が完了した後に関数を実行する方法はありますか? 例えば:
doSomething();
doSomethingElse();
doSomething が完了した後に doSomethingElse() を実行したいだけです。これは可能ですか?
doSomething()
関数が何かを非同期的に実行している場合 (Ajax リクエストの作成など)、リターンの直後に実行するのではなく、その非同期リクエストのコールバックを作成する必要がありdoSomethingElse()
ますdoSomething()
。
実際、jQuery を使用すると、(少なくともある意味では) やりたいことを実行できます。少しハッキーと見なされる可能性がありますが、完璧に機能します。
他に使用しない要素をページに含めるだけです。たとえば、どこかに空の div があります。
<div id="syncFnHolder"></div>
そして、あなたの関数とrunMe
私が書いた関数に JS を含めます。
function doSomething() { alert("First"); }
function doSomethingElse() { alert("Second"); }
function doSomethingElseThree() { alert("Third"); }
function runMe(fn, selec) {
return function() {
fn();
setTimeout(function() {
$(selec).dequeue("syncFnQueue");
}, 1000);
}
};
var selector = "#syncFnHolder";
//add three functions to a queue
$(selector).queue("syncFnQueue", runMe(doSomething, selector));
$(selector).queue("syncFnQueue", runMe(doSomethingElse, selector));
$(selector).queue("syncFnQueue", runMe(doSomethingElseThree, selector));
//start first function in queue (FIFO) others are triggered automatically
$(selector).dequeue("syncFnQueue");
これにより、「1 番目」、「2 番目」、「3 番目」という 1 秒間隔の 3 つのアラートが生成されます。
遅延が必要ない場合は、setTimeout を削除して、呼び出しをそのままにしておきます$(selec).dequeue("syncFnQueue");
。
関数にパラメーターが必要な場合は、たとえばdoSomething(x,y,z)
、関数をより適切なパーシャルに適合させrunMe
、返される関数を別の方法で構築する必要があります。ここを確認するか、新しい質問を投稿してください。
あなたはこれをしたいかもしれません....
function doSomething(callback) {
// code for do some thing
// now fire off the callback
if (typeof callback === 'function') {
callback();
}
}
function doSomethingElse() {
}
doSomething(doSomethingElse);
質問は少しあいまいです。
関数に非同期ビットがある場合は、コールバックを使用します。それが彼らの目的です。
ただし、JavaScript でアスペクト指向プログラミングを行いたい場合は、jQuery-aop をご覧ください。
これ自体を明示的に強制する方法はありませんが、doSomethingElse() がパラメーターとして受け入れる値を doSomething() に返させるという 1 つのアイデアがあります。
retval = doSomething();
doSomethingElse(retval);
そうすれば、少なくとも必要な引数を提供せずに誰かが doSomethingElse() を呼び出すのを防ぐことができます... もちろん、doSomething() を呼び出すことでその引数を取得するかどうかは別の問題です。しかし、これは始まりです。
コードコンプリートから持ち上がったアイデア。