1

検証に関するMongooseのドキュメントでは、「検証は非同期的に再帰的です。Model#saveを呼び出すと、サブドキュメントの検証が実行されます。エラーが発生した場合、Model#saveコールバックがそれを受け取ります

彼らはそれによって何を意味しますか? 5 つの検証があるとします。それらは並行して実行されますか、それとも連続して実行されますか? それとも、モデルの保存メソッドによって受信されるコールバックと連続して呼び出されますか? これを理解するのを手伝ってください。非常に簡単な質問であることはわかっていますが、検索しても何の助けも得られませんでした。だからお願い。

4

1 に答える 1

1

つまり、「同時に」トリガーする複数のイベントがあるにもかかわらず、各メソッドは独自の状態を維持し、リクエストごとおよびステップごとに個別のエラー処理ステップを保持します。

データベース クエリを初期化するためにディスク情報が必要なこの例を考えてみましょう。連続する各ステップは、コールバックを呼び出す非同期操作です。

function dataBaseQuerys(someQuerys) {
    function queryDatabase(someQuery) {

        if(someQuery === undefined) return;

        fs.readFile('someFile', function (err, data) {
            'use strict';

            var myQuery = someQuery + data;

            query(myQuery, function (err, qData) {
                doSomethingWithTheQuery(qData);
                queryDatabase(someQuerys.pop());//Recursion(behaves iteratively, but with async calls!  No for loop necessary)
            });
        });
    }

    queryDatabase(someQuerys.pop());
}

次に、非同期再帰を利用しない次の例を考えてみましょう。

function dataBaseQuerys(someQuerys) {

    for(var i = 0; i < someQuerys.size; i++) {
        var fileData = fs.readFileSync('someFile');

        var myQuery = someQuerys[i] + fileData;

        doSomethingWithTheQuery(querySync(myQuery));//Finding a DB module that does a "querySync" is probably not possible, but assume it is.
    }
}

これら 2 つの例は、同じことを行います。反復的なものは、エラー処理を正しく行うのが少し難しく、javascript の try/catch は最適化できないため良くありません。再帰的なもので、「nextQuery」オブジェクトなどのクロージャー データを取得する構文は少しトリッキーですが、イベント ループを詰まらせることはありません。これは、パフォーマンスにとって非常に貴重です。開発者があなたに言っているのは、最初の例を使用したということだけです。

編集:ここで少し手を握って、これらの例に関連する箇条書きに答えます。

彼らはそれによって何を意味しますか? 正直なところ、ここでこれ以上具体的に説明することはできません...私の例では、彼らが使用しているイディオムを明示的に概説しています。

5 つの検証があるとします。それらは並行して実行されますか、それとも連続して実行されますか? -それらは、非同期で直列に実行されます。これが「再帰」のポイントです。コードの各ポイントは順番に実行されることが保証されていますが、バックグラウンドで他のことが発生する可能性があります。クエリが実装しているコールバック シーケンスに関係することだけではありません。

それとも、モデルの保存メソッドによって受信されるコールバックと連続して呼び出されますか? -はい

これを理解するのを手伝ってください。- これで解決しない場合は、より具体的な質問をする必要があります。また、私の例で示したロジックがこれらすべての質問にどのように対応しているかがわからない場合は、非同期の「イベント ベースのコールバック」に頭を悩ませることにもう少し時間を費やす必要があります。C スタイルのロジック フローに慣れていると、理解するのが難しいかもしれません。

于 2013-07-01T15:14:16.860 に答える