20

node.jsでは、メソッドが同期か非同期かを(関数を使用して)判断できますか?

次のことを行う関数を書きたいと思います。

function isSynchonous(methodName) {
    //if the method is synchronous, return true. Otherwise, return false.
}
4

4 に答える 4

8

言語の観点からは、これは不可能です。これは、ラムダの答えが証明していると思います。

  • 関数は非同期的に処理を実行できますが、同期的に何かを返します。たとえば、起動された非同期タスクの数を返します。
  • 関数は、非同期情報を表す promise を同期的に返すことができます。私はそのようなメソッドを非同期で呼び出しますが、言語は実際にはそれを伝えることができません。
  • ひねくれた意味で、すべての非同期関数は何かを「返す」...undefined他に何もないとしても。

エンジニアリングの観点から:

  • ドキュメントを読んでください。
  • 関数がコールバックを受け入れる場合、おそらく非同期です。関数のシグネチャを見てください。
  • コードを読んでください。
  • 「常識」を使ってください。関数が IO を実行し、IO から結果を返す場合、場合によっては非同期でなければなりません。これには、ファイルの読み取り、標準入力からの読み取り、データベースへの保存、および HTTP/AJAX 要求が含まれます。ストリームは非同期タスクを表すためによく使用されますが、コールバックは特別です。

さらに、この 2 つを組み合わせた機能もあります。

function(callback) {
    if(ready) {
        callback();
    }
    else {
        setTimeout(callback, 5000);
    }
}

おそらくこれは非常に悪いことであり、正しい実践は

if(ready) {
    process.nextTick(callback);
}

そのため、関数の動作は均一です。

ただし、少なくとも Node.js では、非同期が発生したかどうかを確認するハックな方法があります。このディスカッションを参照してください。

// untested!! please read the documentation on these functions before using yourself
var work = process._getActiveHandles().length + process._getActiveCallbacks().length;
foo;
var newWork = (process._getActiveHandles().length + process._getActiveCallbacks().length) - work;
if(newWork > 0) {
    console.log("asynchronous work took place.");
}

これが機能するのは、定義上、非同期作業は同じティックで解決できないためです。また、Node.js はシングル スレッドであるためです。

于 2014-08-19T16:59:24.627 に答える
3

いいえ、それは不可能です。メソッドは同期または非同期としてマークされているだけでなく、コールバックを使用するか使用しないかのいずれかです。

于 2012-10-01T20:08:59.047 に答える