nodejs中的异步递归意味着什么

时间:2013-07-01 14:22:55

标签: node.js mongoose

在用于验证的Mongoose文档中,他们说“验证是异步递归的:当您调用Model#save时,执行子文档验证。如果发生错误,您的Model#save callback会收到它

它们是什么意思?假设我有5次验证,而不是并行或串行运行?或者它们是否与模型保存方法接收的回调串联调用? 请帮我理解一下?我知道这是一个非常简单的问题但我无法从搜索中得到任何帮助。所以请。

1 个答案:

答案 0 :(得分: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次验证,而不是并行或串行运行? - 它们将以异步方式串联运行。这是“递归”的要点。代码中的每个点都保证按顺序运行,但其他事情可能在后台发生,而不是涉及查询正在实现的任何回调序列。

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

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