5

別の関数が完了した後に関数を実行する方法はありますか? 例えば:

doSomething();
doSomethingElse();

doSomething が完了した後に doSomethingElse() を実行したいだけです。これは可能ですか?

4

5 に答える 5

7

doSomething()関数が何かを非同期的に実行している場合 (Ajax リクエストの作成など)、リターンの直後に実行するのではなく、その非同期リクエストのコールバックを作成する必要がありdoSomethingElse()ますdoSomething()

于 2009-11-21T00:42:44.263 に答える
6

実際、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、返される関数を別の方法で構築する必要があります。ここを確認するか、新しい質問を投稿してください。

JavaScript の部分的な

于 2009-11-21T01:23:49.377 に答える
3

あなたはこれをしたいかもしれません....

function doSomething(callback) {
    // code for do some thing
    // now fire off the callback
    if (typeof callback === 'function') {
        callback();
    }
}

function doSomethingElse() {
}

doSomething(doSomethingElse);
于 2013-04-01T07:29:58.033 に答える
2

質問は少しあいまいです。

関数に非同期ビットがある場合は、コールバックを使用します。それが彼らの目的です。

ただし、JavaScript でアスペクト指向プログラミングを行いたい場合は、jQuery-aop をご覧ください

于 2009-11-21T01:35:35.203 に答える
-1

これ自体を明示的に強制する方法はありませんが、doSomethingElse() がパラメーターとして受け入れる値を doSomething() に返させるという 1 つのアイデアがあります。

  retval = doSomething();
  doSomethingElse(retval);

そうすれば、少なくとも必要な引数を提供せずに誰かが doSomethingElse() を呼び出すのを防ぐことができます... もちろん、doSomething() を呼び出すことでその引数を取得するかどうかは別の問題です。しかし、これは始まりです。

コードコンプリートから持ち上がったアイデア。

于 2009-11-21T00:42:42.653 に答える