Javascript 如何在另一个异步'each'方法(NodeJS)内部进行异步方法调用?
如何在另一个异步Javascript 如何在另一个异步'each'方法(NodeJS)内部进行异步方法调用?,javascript,node.js,mongodb,asynchronous,each,Javascript,Node.js,Mongodb,Asynchronous,Each,如何在另一个异步每个方法(NodeJS)内部进行异步方法调用 具体示例-使用数据库时,我需要删除所有记录。 但我不能只删除整个收藏,我需要一个接一个地销毁所有记录,在删除之前,我需要读取记录,在应用程序中执行一些业务逻辑,然后再删除它 因此,让我们尝试实现我们的deleteAll方法(实际上它是来自NodeMongoDB本机驱动程序的真实API): 实际上有一种方法可以做到这一点——使用collection.nextObject方法而不是collection.each,但我想知道是否可以使用ea
每个方法(NodeJS)内部进行异步方法调用
具体示例-使用数据库时,我需要删除所有记录。
但我不能只删除整个收藏,我需要一个接一个地销毁所有记录,在删除之前,我需要读取记录,在应用程序中执行一些业务逻辑,然后再删除它
因此,让我们尝试实现我们的deleteAll
方法(实际上它是来自NodeMongoDB本机驱动程序的真实API):
实际上有一种方法可以做到这一点——使用collection.nextObject
方法而不是collection.each
,但我想知道是否可以使用each
解决这个问题?现在我认为这是不可能的,但也许我错了
更新:每个
方法的来源:
Cursor.prototype.each = function(callback) {
var self = this;
if (!callback) {
throw new Error('callback is mandatory');
}
if(this.state != Cursor.CLOSED) {
process.nextTick(function(){
// Fetch the next object until there is no more objects
self.nextObject(function(err, item) {
if(err != null) return callback(err, null);
if(item != null) {
callback(null, item);
self.each(callback);
} else {
// Close the cursor if done
self.state = Cursor.CLOSED;
callback(err, null);
}
item = null;
});
});
} else {
callback(new Error("Cursor is closed"), null);
}
};
好吧,你写的东西会有用的,尽管不确定这一行:
if(doc === null){
// each returns null when there's no more documents, we are finished.
callback(null)
因为,我不知道逻辑,但那会起作用的。从技术上讲,函数不会等待,您只需传递另一个函数,该函数将在工作完成时执行。这里所做的是异步和并行的。您还可以查看模块中每个函数和一些其他函数的异步版本。尝试类似的方法
deleteAll = function(selector, callback){
// count all documents you need to fire remove for
var count = collection.filter(function(doc) { return doc === null }).length,
i = count;
collection.find(selector).each(function(err, doc){
if(err){
callback(err)
}else{
if(doc === null){
callback(null)
}else{
doSomeBusinessLogicBeforeDelete(doc)
collection.remove({_id: doc._id}, function(err){
i--;
if (i <= 0) callback('done');
})
}
}
})
}
deleteAll=函数(选择器、回调){
//清点您需要删除的所有文档
var count=collection.filter(函数(doc){return doc==null}).length,
i=计数;
collection.find(选择器)。each(函数(err,doc){
如果(错误){
回调(错误)
}否则{
如果(doc==null){
回调(空)
}否则{
doSomeBusinessLogicBeforeDelete(文档)
删除({u-id:doc.\u-id},函数(err){
我--;
如果(我是这样,在使用node几个月后,我得到了我的问题的答案,下面是异步的一个可能实现(可能有其他类似的实现,但在错误处理方面有细微的差异):
mongo中每个
的实现都是不同的,它不可能进行正确的顺序迭代(也许可以,也许他们心中有不同的设计目标).你有每个方法的源代码吗?如果你有,应该很容易找到你。嗯,是的,它可以工作,但是集合.remove
将并行执行,而不是串行执行,甚至在某些“collection.remove”完成之前,最终的回调可能会触发。
deleteAll = function(selector, callback){
// count all documents you need to fire remove for
var count = collection.filter(function(doc) { return doc === null }).length,
i = count;
collection.find(selector).each(function(err, doc){
if(err){
callback(err)
}else{
if(doc === null){
callback(null)
}else{
doSomeBusinessLogicBeforeDelete(doc)
collection.remove({_id: doc._id}, function(err){
i--;
if (i <= 0) callback('done');
})
}
}
})
}
asyncEach(
function(obj, next){
// do something with obj
// call next when You finish and want next object,
// You can also pass error into next in case of error.
console.log(obj)
next()
},
function(err){
// Will be called when there's no more objects.
}
)