与 Node.js 和 Mongoose 的异步模式
Async Patterns with Node.js and Mongoose
具体来说,我正在使用Mongoose和Node,但我想这是一个关于异步编码的概念性问题。
我在猫鼬文档中到处看到这个例子:
product.sold = Date.now();
product.save(function (err, product, numberAffected) {
if (err) ..
})
但是,如果
product.save(...)
执行速度快于
product.sold = Date.now()
您不会在更新之前保存吗...?也许我在这里错过了一些东西(在概念层面上)?是什么让这段代码在异步环境中保持"安全"。
更具体地说,我正在使用doc.addToSet作为"更新"步骤,如果它有一个回调,我可以嵌入doc.save步骤(以确保异步行为),我会感觉好多了。思潮?
附言。我不只是使用 model.update,因为我需要验证。
每一行同时执行。在这种情况下,product.sell 正在被分配并像正常操作一样完成,然后按顺序调用 save。
异步部分发生在 product.save 中。正在发生的事情是,您将一个函数作为参数传递给product.save,这也是一个函数。这称为匿名回调。它没有名称,从 product.save 内部异步调用。
以下是执行的顺序:
- Date.now() 被分配给 product.sold 并且操作完成
- product.save(callback(...){...})被调用
- product.save 到达回调并执行它,即 product.save 的定义中有一行说
callback.call(...)
,然后 product.save 返回 - 在 product.save 之后(您尚未列出)之后但在回调完成之前,下一行继续执行
- 回调在某个时间完成
因此,您更新产品并成功保存。您传递的匿名函数不是实际保存它的内容,而是一个异步扩展来执行您想要的操作,即处理错误或确保保存正确数量的项目。
您不必担心在保存之前发生更新操作,因为它会阻塞。
要了解阻塞(同步)和非阻塞(异步)操作之间的区别,请遵循以下基本异步代码:
function async(callback) {
process.nextTick(callback);
}
async(function() {
console.log('foo');
}
console.log('bar');
这将按顺序显示 bar
,然后foo
。这里的关键是函数 process.nextTick(cb)
,它会延迟回调的执行。
由于 NodeJS 只使用一个线程,它将等待整个函数堆栈返回,然后在进程的下一个循环中执行回调。现在,如果更新操作是异步的,则必须在传递给该操作的回调函数中执行保存操作。
但是,由于它不是(您可以从文档中看到这一点,并且通常,函数不接受任何回调参数的事实是一个很好的指示),因此在返回该更新操作之前,该函数的执行将被阻止。
- 在 Node 中.js释放 zalgo 的设计模式为什么异步路径是一致的
- 同步/异步AJAX函数的模式
- 如何避免这种异步延迟模式
- 如何在 JavaScript 中保持以下异步模式 DRY
- 异步函数的 JavaScript 回调:是否有任何模式可以区分“返回值”和“异常”
- 在正文中异步加载的JS使浏览器处于“加载”模式
- 需要JS加载异步模板模块模式
- 用于处理成功、失败、重试的异步请求的设计模式?(JavaScript)
- Jquery对话框异步模式
- 如何实现Typescript异步等待模式:Promise在哪里
- 流星客户端异步模式 / 如何为订阅列表和回调实现 waitOn
- Babel v6-transform-es2015类插件在松散模式下抛出SyntaxError:异步/等待的意外标识符
- 简化异步调用的简单客户端框架/模式
- 在nodejs中,是否有更好的设计模式来同步调用异步函数
- 揭示模块模式&变量范围->异步调用返回后未定义公共对象
- 在Node.js中处理异步循环的最佳模式
- 在Node.js中短路非错误异步流的模式
- 通过Node异步调用设置变量的正确模式
- 异步模式下的Ajax回调冲突
- 与 Node.js 和 Mongoose 的异步模式