1
test = function(x){   
    if ( some conditions ) { return true; }
    else { return false; }
}


if (test(y)) {document.write("You have done this before!")​}​;​

console.log("Checked!");

その意図は、ユーザーが過去に何らかのアクションを実行したかどうかを確認することです。これらは、私が実際に行っていることを実際には反映していない単なるモックアップ コードです。

質問:

私はnode.jsに比較的慣れていないので、これが些細なことに聞こえる場合はご容赦ください。test(y) が真であるとします。document.write の後に console.log が実行されることを確認できますか? test(y) の実行に時間がかかる場合でも?

つまり、ブロックするには「if (test(y))...」が必要です。setInterval(test(y),100); など、関数を引数として渡すことを理解しています。非同期でノンブロッキングにすることができます。しかし、「if(test(y))...」はどうでしょうか?

4

3 に答える 3

8

NodeJSには、同期(ブロッキング)機能と非同期(非ブロッキング)機能の両方があります。(より正確には、関数自体は常に「ブロッキング」ですが、それらのクラス全体が、後で完了するものを開始し、終了するのを待たずにすぐに戻ります。これらは、「非ブロッキング」の意味です。)

ほとんどの場合、デフォルトは非同期です(そして、開始したことが完了したときに呼び出すコールバックを受け入れます)。同期のものは、名前が。で終わる傾向がありますSync

したがって、たとえば、exists非同期(非ブロッキング)であり、戻り値がなく、完了時にコールバックを呼び出します。existsSync同期(ブロッキング); コールバックではなく、結果を返します。

testが独自の関数であり、同期関数のみを呼び出す場合は、同期です。

function test(x) { // Obviously a nonsense example, as it just replicates `existsSync`
    if (existsSync(x)) {
        // The file exists
        return true;
    }
    return false;
}

// This works
if (test("foo.txt")) {
    // ...
}

非同期関数を呼び出す場合は非同期であるため、次のようにテストできる戻り値を介して結果を返すことはできませんif

// WRONG, always returns `undefined`
function test(x) {
    var retVal;

    exists(x, function(flag) {
        retVal = flag;
    });

    return retVal;
}

代わりに、コールバックを提供する必要があります。

function test(x, callback) {

    exists(x, function(flag) {
        callback(flag);
    });
}

// This works
test("foo.txt", function(flag) {
    if (flag) {
        // ...
    }
});
于 2012-06-29T11:42:14.970 に答える
0

はい、このコードは同期実行され、「ブロック」されています。ただし、if ステートメントで document.write を省略しただけなので、スクリプトが実行されるたびに console.log が実行されます。

于 2012-06-29T11:45:16.307 に答える
0

ここで、ブロッキング/ノンブロッキングの用語は少し混乱します。「関数名の Sync サフィックスで明示的に示されている場合を除き、Node.JS のすべての関数はブロッキングであり、ノード標準ライブラリのすべての IO はノンブロッキングです」と言えます。

于 2012-06-30T08:18:00.363 に答える