4

NodeJ で非同期制御フローを維持する方法を理解できないようです。私の意見では、すべてのネストにより、コードが非常に読みにくくなっています。私は初心者なので、全体像を見落としている可能性があります。

このような単純なコーディングの何が問題になっていますか...

function first() {
    var object = {
        aProperty: 'stuff',
        anArray: ['html', 'html'];
    };
    second(object);
}

function second(object) {
    for (var i = 0; i < object.anArray.length; i++) {
        third(object.anArray[i]);
    };
}

function third(html) {
    // Parse html
}
first();
4

2 に答える 2

7

「全体像」は、すべての I/O が非ブロッキングであり、JavaScript で非同期に実行されるということです。したがって、データベースの検索、ソケットからのデータの読み取り (HTTP サーバーなど)、ディスクへのファイルの読み取りまたは書き込みなどを行う場合、非同期コードを使用する必要があります。これは、イベント ループが単一のスレッドであるため必要であり、I/O がノンブロッキングでない場合、プログラムは実行中に一時停止します。

入れ子が少なくなるようにコードを構造化できます。例えば:

var fs = require('fs');
var mysql = require('some_mysql_library');

fs.readFile('/my/file.txt', 'utf8', processFile);

function processFile(err, data) {
  mysql.query("INSERT INTO tbl SET txt = '" + data + "'", doneWithSql);
}

function doneWithSql(err, results) {
  if(err) {
    console.log("There was a problem with your query");
  } else {
    console.log("The query was successful.");
  }
}

多数のネストされたコールバックを回避するのに役立つasync (個人的な選択)などのフロー制御ライブラリもあります。

この件に関して私が作成したこのスクリーンキャストに興味があるかもしれません。

于 2012-07-21T17:26:12.377 に答える
1

@BrandonTilley が言ったように、I/O は非同期であるため、それらを処理するには Node.js でコールバックが必要です。これが、Node.js が 1 つのスレッドだけで多くのことを実行できる理由です (実際には 1 つのスレッドで多くのことを実行しているわけではありませんが、スレッドがデータを待機するのではなく、次のタスクの処理を開始し、I/ O が戻ってくると、指定したコールバック関数でそのタスクに戻ります)。

しかし、ネストされたコールバックは、由緒あるasyncや私の新しい小さなライブラリである queue-flowのような優れたライブラリで処理できます。それらはコールバックの問題を処理し、コードを入れ子にせず、ブロッキングの同期コードと非常によく似た外観に保つことができます。:)

于 2012-07-21T17:32:28.050 に答える