gpt4 book ai didi

node.js - Nodejs中的异步递归是什么意思

转载 作者:太空宇宙 更新时间:2023-11-04 01:11:09 24 4
gpt4 key购买 nike

在 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 风格的逻辑流程,那么您可能很难理解,我曾经经历过这种情况,并希望当时有人能告诉我同样的事情。

关于node.js - Nodejs中的异步递归是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17406806/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com