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.
    }
}

这两个例子做同样的事情。迭代的更难正确处理错误,而 JavaScript 中的 try/catch 很糟糕,因为它不允许优化。递归的,获取“nextQuery”对象等的闭包数据的语法有点棘手,但它不会阻塞事件循环,这对性能来说是无价的。所有开发人员都告诉您的是,他们使用了第一个示例。

编辑:我将在这里稍稍举手并回答与这些示例有关的要点:

他们是什么意思?老实说这里不能更具体......我的例子明确概述了他们使用的成语。

假设我有 5 个验证,它们将并行还是串行运行?-它们将异步串行运行。这就是“递归”的重点。代码中的每个点都保证按顺序运行,但其他事情可能在后台发生,只是不涉及查询正在实现的任何回调序列的事情。

或者它们是否被模型保存方法接收到的回调串联调用?-是的

请帮我理解这个?- 如果这没有帮助,你需要问一个更具体的问题。此外,如果您没有看到我在示例中列出的逻辑如何涵盖所有这些问题,那么您应该花更多的时间来了解异步“基于事件的回调”。如果你习惯于 C 风格的逻辑流程,你可能很难理解,我去过那里,希望当时有人会告诉我同样的事情。

于 2013-07-01T15:14:16.860 回答