在用于验证的 Mongoose 文档中,他们说“验证是异步递归的:当您调用 Model#save 时,将执行子文档验证。如果发生错误,您的 Model#save 回调会收到它”
他们是什么意思?假设我有 5 个验证,它们将并行还是串行运行?或者它们是否被模型保存方法接收到的回调串联调用?请帮我理解这个?我知道这是一个非常简单的问题,但我无法从搜索中获得任何帮助。所以,请。
这意味着,尽管您有多个事件“同时”触发,但每个方法都保持自己的状态,并且每个请求和每个步骤都有自己的错误处理步骤。
考虑这个例子,我们需要磁盘信息来初始化数据库查询。每个连续的步骤都是一个异步操作,它调用一个回调。
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 风格的逻辑流程,你可能很难理解,我去过那里,希望当时有人会告诉我同样的事情。